有 n 个物品,每种物品有一个颜色用 11 到 k 的整数表示(≤100k≤100),求满足体积总和小于给定的 m 且每种颜色物品最多只能取一个的前提下,价值和的最大值。这个问题被称作“分组背包”问题。下面有一段不完整的程序设计,补充()在空缺处可以解决分组背包问题。
const int N = 1e4 + 5;
int n, m;
vector> g[105];
int dp[N];
signed main()
{
cin >> m >> n;
for (int i = 1, a, b, c; i <= n; i++)
{
cin >> a >> b >> c; // 第 i 个物品的价值,体积,颜色,保证都是100以内的正整数
g[c].push_back({a, b});
}
// ______ 此处填空
if (j >= p.w)
dp[j] = max(dp[j], dp[j - p.first] + p.second);
cout << dp[m] << endl;
return 0;
}