AcWing 9. 分组背包问题
原题链接
中等
C++ 代码
// 分组背包问题
// 每组中的物品是互斥的,它们之间没有联系,如果每组中有 S 件物品,那么每组的状态就是 S + 1 种状态,每件物品只有两种状态。
// 我们只需枚举出当前组中所有的状态,在所有状态中挑出价值最大的物品即可。
#include <iostream>
#include <vector>
using namespace std;
const int n = 110;
int v[n], w[n];
// 状态初始化
int f[n];
int main()
{
int N, V;
cin >> N >> V;
for(int i = 0; i < N; ++i) // 组数
{
int S = 0;
cin >> S;
for(int j = 0; j < S; ++j) // 组中物品数
{
cin >> v[j] >> w[j];
}
// 状态转移
for(int k = V; k >= 0; --k)
{
for(int s = 0; s < S; ++s) // 组中每件物品就是 01 背包问题,从当前组中选取一个最大的。
{
if(v[s] <= k)
{
f[k] = max(f[k], f[k - v[s]] + w[s]);
}
}
}
}
cout << f[V] << endl;
return 0;
}