参考y总的讲解,背包问题基本就是先对组遍历、再对体积遍历、最后对策略遍历.
#include<bits/stdc++.h>
using namespace std;
int dp[105][105];
vector<int>fu[105];
int a[105];//体积
int b[105];//价值
int n,m;
int v,w,p;
int root;
int cnt=0;
int ans=0;
void dfs(int root){
for(int i=0;i<fu[root].size();i++)
{
int son=fu[root][i];
dfs(son);
for(int j=m-a[root];j>=0;j--)
{
for(int i=0;i<=j;i++)
dp[root][j]=max(dp[root][j],dp[root][j-i]+dp[son][i]);
}
}
for(int i=m;i>=a[root];i--)dp[root][i]=dp[root][i-a[root]]+b[root];
for(int i=0;i<a[root];i++)dp[root][i]=0;
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
{
cin>>v>>w>>p;
if(p==-1)root=i;
else fu[p].push_back(i);
a[i]=v;
b[i]=w;
}
dfs(root);
cout<<dp[root][m];
return 0;
}