hdu 1011 树形dp

来源:互联网 发布:手机遥控器软件大全 编辑:程序博客网 时间:2024/05/16 14:15
#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]);}}

0 0
原创粉丝点击