有依赖的背包问题

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];
}