标签:
http://acm.hdu.edu.cn/showproblem.php?pid=1561
3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0
5 13
/** hdu 1561 树形dp 题目大意:中文题不在赘述 解题思路:加一个根节点0,构成一棵树。背包,dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]);( j:2~m; k:1~j-1 ) */ #include <stdio.h> #include <string.h> #include <algorithm> #include <iostream> using namespace std; const int maxn=205; struct note { int v,next; }edge[maxn*2]; int head[maxn],ip; int n,m,dp[205][205],a[205]; void init() { memset(head,-1,sizeof(head)); ip=0; } void addedge(int u,int v) { edge[ip].v=v,edge[ip].next=head[u],head[u]=ip++; } void dfs(int u,int pre) { for(int i=1;i<=m;i++) dp[u][i]=a[u]; for(int i=head[u];i!=-1;i=edge[i].next) { int v=edge[i].v; if(v==pre)continue; dfs(v,u); for(int j=m;j>1;j--) { for(int k=1;k<j;k++) dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]); } } } int main() { while(~scanf("%d%d",&n,&m)) { if(n==0&&m==0)break; m++; init(); a[0]=0; for(int i=1;i<=n ;i++) { int v,w; scanf("%d%d",&v,&w); addedge(i,v); addedge(v,i); a[i]=w; } memset(dp,0,sizeof(dp)); dfs(0,-1); printf("%d\n",dp[0][m]); } return 0; } /*** 3 2 0 1 0 2 0 3 7 7 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0 */
3 2 0 1 0 2 0 3 7 4 2 2 0 1 0 4 2 1 7 1 7 6 2 2 0 0
5 13
标签:
原文地址:http://blog.csdn.net/lvshubao1314/article/details/43674235