您的位置:首页 > 运维架构

【hdu 1011】Starship Troopers 树形dp

2016-10-22 11:32 387 查看
4000

树形依赖背包,转移必须是三维,郁闷的是居然写了那么久,因为每一个点即是没有bug还是要一个人去对吧?k必须从1开始,从0开始会wa,而且根必须是1,好扯淡啊

#include<cstdio>
#include<cstring>
#include<iostream>
#define maxn 105
using namespace std;
int f[maxn][maxn],n,m,tot,head[3*maxn],w[maxn],ned[maxn],is_rt[maxn];
struct edge{
int v,next;
}e[maxn*3];
void adde(int a,int b){e[tot].v=b,e[tot].next=head[a];head[a]=tot++;}
void dfs(int u,int fa){
int x=ned[u],y=w[u];
for(int i=x;i<=m;i++)f[u][i]=y;
for(int i=head[u];~i;i=e[i].next)if(e[i].v!=fa)dfs(e[i].v,u);
for(int i=head[u];~i;i=e[i].next){
int v=e[i].v;if(v==fa)continue;
for(int j=m;j>=x;j--){
for(int k=j-ned[u];k>=1;k--){
f[u][j]=max(f[u][j],f[v][k]+f[u][j-k]);
}
}
}
}

int main(){
while(scanf("%d%d",&n,&m)&&(~n)&&~m){
memset(head,-1,sizeof(head));memset(f,0,sizeof(f)),tot=0;
for(int i=1;i<=n;i++){
scanf("%d%d",ned+i,w+i);
ned[i]=(ned[i]+19)/20;
}
for(int a,b,i=1;i<n;i++){
scanf("%d%d",&a,&b);
adde(a,b);adde(b,a);
}
if(!m){
printf("0\n");continue;
}
dfs(1,1);
printf("%d\n",f[1][m]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: