hdu1011 树形背包
2015-04-30 01:10
302 查看
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 105; int n,m; int dp[maxn][maxn]; int w[maxn]; int v[maxn]; struct Edge{ int v,next; }edge[maxn<<1]; int g[maxn]; void add(int u,int v,int i){ edge[i<<1].v = v; edge[i<<1].next = g[u]; g[u] = i<<1; edge[(i<<1)|1].v = u; edge[(i<<1)|1].next = g[v]; g[v] = (i<<1)|1; } void dfs(int x){ if(dp[x][0] != -1) return; int i; for(i=0;i<=m;i++){ if(i*20 < w[x]) dp[x][i] = 0; else break; } int minp = i; for(;i<=m;i++) dp[x][i] = v[x]; for(int e=g[x];e!=-1;e=edge[e].next){ if(dp[edge[e].v][0] != -1) continue; dfs(edge[e].v); //至少要给后面一个人,因此j>minp,k从1开始 for(int j=m;j>minp;j--){ for(int k=1;k<=j-minp;k++){ dp[x][j] = max(dp[x][j],dp[x][j-k]+dp[edge[e].v][k]); } } } } int main(){ while(scanf("%d%d",&n,&m)==2 && n!=-1){ memset(dp,-1,sizeof(dp)); memset(g,-1,sizeof(g)); for(int i=1;i<=n;i++) scanf("%d%d",&w[i],&v[i]); for(int i=1;i<n;i++){ int u,v; scanf("%d%d",&u,&v); add(u,v,i); } if(m==0) {printf("0\n");continue;} dfs(1); printf("%d\n",dp[1][m]); } return 0; }
相关文章推荐
- hdu1011 树形dp背包
- Hdu1011 Starship Troopers -- 树形背包
- 【树形DP+背包】 hdu1011 Starship Troopers
- Hdu1011 树形dp,多重背包
- hdu1011(树形背包)
- hdu1011(背包树形DP)
- hdu1011(树形背包)
- hdu1011(树形背包)
- ZOJ 3201 Tree of Tree(树形dp + 分组背包)
- hdu1011 树形dp
- poj 1947(树形背包问题)
- hdu 1054 树形背包
- POJ 1947 树形DP(分组背包)
- hdu 1011 树形dp 背包
- HDU - 4044 J - GeoDefense 【树形DP+分组背包】
- XJOI NOIP2016提高组冲剌题2 T3:tree(树形DP+背包)
- POJ 1155 树形背包(DP) TELE
- poj 1155 TELE 树形dp泛化背包
- HDU 1561 The more, The Better(树形dp 依赖背包)
- HDU1011:Starship Troopers(树形DP)