AcWing 10. 有依赖的背包问题
原题链接
困难
作者:
Global_zzz
,
2021-03-15 23:12:52
,
所有人可见
,
阅读 351
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
int h[N] , e[N] , ne[N] , idx;
int v[N] , w[N];
int f[N][N];
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 = v[u] ; i <= m ; i ++ ) f[u][i] = w[u]; // 每一个u的子节点都具有u的值
for (int i = h[u] ; ~i ; i = ne[i] ) {
int j = e[i];
dfs(j);
for (int k = m ; k >= v[u] ; k -- ) { // 01 背包问题,选取区间必须大于v[u] 因为v[u] 必须选
for (int t = 0 ; t <= k - v[u] ; t ++ ) // 由于选取了v[u] 所以 t 的更新范围只能到 k - v[u]
f[u][k] = max(f[u][k] , f[u][k - t] + f[j][t]);
}
}
}
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];
}