You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
|
|
#include <bits/stdc++.h>
|
|
|
|
|
|
|
|
|
|
using namespace std;
|
|
|
|
|
/**
|
|
|
|
|
8. 泛化物品
|
|
|
|
|
)题目:
|
|
|
|
|
在背包容量为v的背包问题中,泛化物品是一个定义域为0..v中的整数的函数h,当分配给它的费用为v时,能得到的价值就是h(v)。
|
|
|
|
|
为了应用泛化物品思想,这里假设题目为:存在依赖关系树(简单起见,只有一个根节点),即有依赖的物品也可以被依赖,可结合原文7.3节来理解此句。
|
|
|
|
|
2)输入:
|
|
|
|
|
测试用例数
|
|
|
|
|
物品数 背包容量 根节点编号
|
|
|
|
|
第i个物品的ci wi di(依赖物品的编号,-1为不依赖其他物品)
|
|
|
|
|
* @return
|
|
|
|
|
*/
|
|
|
|
|
#define maxN 100
|
|
|
|
|
#define maxV 1000
|
|
|
|
|
|
|
|
|
|
int n, v;
|
|
|
|
|
int cnt = 0;
|
|
|
|
|
int head[maxN];
|
|
|
|
|
int wi[maxN], ci[maxN];
|
|
|
|
|
int f[maxN][maxV];
|
|
|
|
|
|
|
|
|
|
struct Edge {
|
|
|
|
|
int v, next;
|
|
|
|
|
} e[maxN - 1];
|
|
|
|
|
|
|
|
|
|
void addEdge(int u, int v) {
|
|
|
|
|
e[cnt].v = v;
|
|
|
|
|
e[cnt].next = head[u];
|
|
|
|
|
head[u] = cnt++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void treeDP(int u) {
|
|
|
|
|
for (int i = ci[u]; i <= v; i++) {
|
|
|
|
|
f[u][i] = wi[u];
|
|
|
|
|
}
|
|
|
|
|
for (int i = head[u]; i != -1; i = e[i].next) {
|
|
|
|
|
int curr = e[i].v;
|
|
|
|
|
treeDP(curr);
|
|
|
|
|
for (int j = v; j >= 0; j--) {
|
|
|
|
|
for (int k = j - ci[u]; k >= 0; k--) {
|
|
|
|
|
f[u][j] = max(f[u][j], f[u][j - k] + f[curr][k]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int main(void) {
|
|
|
|
|
int cases, root;
|
|
|
|
|
freopen("../8.txt", "r", stdin);
|
|
|
|
|
cin >> cases;
|
|
|
|
|
while (cases--) {
|
|
|
|
|
cnt = 0;
|
|
|
|
|
memset(head, -1, sizeof(head));
|
|
|
|
|
memset(f, 0, sizeof(f));
|
|
|
|
|
cin >> n >> v >> root;
|
|
|
|
|
for (int i = 0; i < n; i++) {
|
|
|
|
|
int di;
|
|
|
|
|
cin >> ci[i] >> wi[i] >> di;
|
|
|
|
|
addEdge(di, i);
|
|
|
|
|
}
|
|
|
|
|
treeDP(root);
|
|
|
|
|
cout << f[root][v] << endl;
|
|
|
|
|
}
|
|
|
|
|
}
|