Code:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int n,V;
int f[N][N];//f[i][j]表示以i为根的子树的体积<=j的最大价值
int v[N],w[N];
int h[N],e[N],ne[N],idx;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx ++ ;
}
int root;
void dfs(int u){
for(int i=h[u];~i;i=ne[i]){//枚举物品
int son=e[i];
dfs(son);//先把子树的最大价值数组算出来
//分组背包
for(int j=V-v[u];j>=0;j--){//枚举背包体积
for(int w=0;w<=j;w++){//枚举分组中一组的物品
//这里把分组中每一个体积当成一个子物品
//这样把复杂度从2^n下降到了V
f[u][j]=max(f[u][j],f[u][j-w]+f[son][w]);
}
}
}
for(int i=V;i>=v[u];i--)f[u][i]=f[u][i-v[u]]+w[u];
for(int i=0;i<v[u];i++)f[u][i]=0;
}
int main(){
cin>>n>>V;
memset(h, -1, sizeof h);
for(int i=1;i<=n;i++){
int p;
cin>>v[i]>>w[i]>>p;
if(p!=-1)add(p,i);
else root=i;
}
dfs(root);
for(int i=1;i<=n;i++){
for(int j=0;j<=V;j++)cout<<f[i][j]<<" ";
cout<<endl;
}
cout<<f[root][V];
}
浙公网安备 33010602011771号