您的位置:首页 > 其它

hdu 1011 树形dp

2017-04-27 14:59 274 查看
#include<cstdio>
#include<cstring>
#define MAX(x,y) ((x)>(y)?(x):(y))
struct node
{
int to,next;
}e[240];
int cnt,head[120];
int n,m,dp[120][120],num[120];
int value[120];
void add_edge(int from,int to)
{
e[cnt].to=to;
e[cnt].next=head[from];
head[from]=cnt++;
}
void dfs(int u,int v)
{
for(int i=head[u];i!=-1;i=e[i].next)
{
int g=e[i].to;
if(g==v)
continue;
dfs(g,u);
for(int j=m;j>0;j--)
{
for(int k=1;(j-k)>=num[u];k++)
{
dp[u][j]=MAX(dp[u][j],dp[u][j-k]+dp[g][k]);
}
}
}
for(int i=num[u];i<=m;i++)
dp[u][i]+=value[u];
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==-1&&m==-1)
break;
memset(dp,0,sizeof(dp));
memset(num,0,sizeof(num));
for(int i=1;i<=n;i++)
{
int t;
scanf("%d%d",&t,&value[i]);
num[i]=(t+19)/20;
}
memset(head,-1,sizeof(head));
cnt=0;
for(int i=1;i<n;i++)
{
int a,b;
scanf("%d%d",&a,&b);
add_edge(a,b);
add_edge(b,a);
}
if(m==0)
{
printf("0\n");
continue;
}
dfs(1,-1);
printf("%d\n",dp[1][m]);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  动态规划 dp