#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int h[N],e[N],ne[N],idx;
int v[N],w[N];
int f[N][N];//以i为根节点,体积为j的最大价值
int n,m;
void add(int a,int b)
{
e[idx]=b;
ne[idx]=h[a];
h[a]=idx++;
}
void dfs(int u)
{
for(int i=h[u];i!=-1;i=ne[i])
{
int son=e[i];
dfs(son);
for(int j=m-v[u];j>=0;j--)
{
for(int k=0;k<=j;k++)
{
//给子树分配体积
//留出子树需要占用的体积再加上子树产生的价值。
f[u][j]=max(f[u][j],f[u][j-k]+f[son][k]);
}
}
}
//先遍历子节点,选择子节点时必选择父节点
for(int j=m;j>=v[u];j--)
f[u][j]=f[u][j-v[u]]+w[u];
//将小于物品体积的背包容量置0(不选)
for(int j=0;j<v[u];j++)
f[u][j]=0;
}
int main()
{
cin>>n>>m;
int root;
memset(h,-1,sizeof h);
for(int i=1;i<=n;i++)
{
int p;
cin>>v[i]>>w[i]>>p;
if(p==-1)root=i;
else add(p,i);
}
dfs(root);
cout<<f[root][m];
return 0;
}
AcWing 10. 有依赖的背包问题
最新推荐文章于 2024-07-12 16:34:36 发布