标签:
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