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]); } }
相关文章推荐
- hdu 1011 Starship Troopers(树形DP)
- hdu 1011 ,hdu 1561,树形DP
- hdu 1011 Starship Troopers (树形背包dp)
- HDU 1011 Starship Troopers (树形DP)
- HDU 1011 Starship Troopers(树形DP)
- hdu 1011 Starship Troopers(树形DP)
- hdu 1011 Starship Troopers 树形dp
- hdu 1011 Starship Troopers 树形dp
- hdu 1011 树形DP
- hdu 1011 Starship Troopers(树形DP+背包问题)
- hdu 1011 Starship Troopers(树形dp)
- hdu 1011 树形DP
- hdu 1011(树形dp)Starship Troopers
- hdu 1011 Starship Troopers(树形DP)
- HDU 1011 Starship Troopers 树形DP(0-1背包)
- HDU 1011 Starship Troopers - 01树形dp 有坑啊!!
- HDU 1011 Starship Troopers---树形dp+有依赖的背包
- hdu 1011 树形dp 背包
- HDU-1011 树形dp
- HDU 1011 Starship Troopers 树形DP(0-1背包)