您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: