【hdu 1011】Starship Troopers 树形dp

来源:互联网 发布:手机网游推荐 知乎 编辑:程序博客网 时间:2024/05/16 12:40

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

#include<cstdio>#include<cstring>#include<iostream>#define maxn 105using 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;}



0 0
原创粉丝点击