树形背包——hdu1561
题目含义
第一行给出城堡个数N和背包容量M
第i+1行给出i的父亲以及i的权值
求装m个城堡能得到的最大权值
题目分析
入门的树形背包
题目代码
#include<iostream> #include<stdio.h> #include<string.h> using namespace std; const int maxn=300; const int INF=0x3f3f3f3f; struct node{ int to; int next; }edge[maxn<<1]; int head[maxn],dp[maxn][maxn],val[maxn]; int n,m,tot,a,b; void add(int u,int v){ edge[tot].to=v; edge[tot].next=head[u]; head[u]=tot++; } void dfs(int u){ dp[u][1]=val[u]; for(int i=head[u];i!=-1;i=edge[i].next){ int v=edge[i].to; dfs(v); for(int j=m;j>0;j--) for(int k=0;k<j;k++){ dp[u][j]=max(dp[u][j],dp[u][j-k]+dp[v][k]); } } } int main(){ while(scanf("%d%d",&n,&m)){ if(n==0&&m==0)return 0; memset(dp,0,sizeof(dp)); memset(head,-1,sizeof(head)); tot=0; for(int i=1;i<=n;i++){ scanf("%d%d",&a,&b); add(a,i); val[i]=b; } m++; val[0]=0; dfs(0); printf("%d\n",dp[0][m]); } }