遇到的分组背包问题 题解
作者:
萨满
,
2022-04-17 19:49:52
,
所有人可见
,
阅读 208
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
struct Node{
int c, d; // c d为物品的重量和价值
};
int main()
{
int T;
cin >> T;
while (T --) // 多组测试数据
{
int n;
cin >> n;
vector<vector<Node>> data(n + 1);
for (int i = 0; i < n; i ++)
{
int a, b, c;
cin >> a >> b >> c;
data[a].push_back((Node){b, c}); // a为物品的类别
}
vector<vector<int>> f(8, vector<int>(251, -1e9));
int res = 0;
f[0][0] = 0;
for (int i = 1; i <= 6; i ++)
for (int j = 0; j <= 250; j ++)
for (int k = 0; k < data[i].size(); k ++)
{
if (j >= data[i][k].c) // 能放得下,更新
{
f[i][j] = max(f[i][j], f[i - 1][j - data[i][k].c] + data[i][k].d);
}
if (j >= 100) res = max(res, f[i][j]); // 总和>=100,限制条件
}
if (res == 0) puts("TAT");
else cout << res << endl;
}
return 0;
}