分组背包,每组最多只能选择其中的一种物品。
f[i][j]表示只从前i组物品中选且总体积不大于j的所有选法中的最大值
f[i][j] = max(f[i - 1][j], f[i - 1][j - Vi,k] + Wi,k)
因为每组中的物品选或者不选,可用类似于0/1背包优化的方式,使用滚动数据,倒循环优化
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
int f[N], s[N];
int v[N][N], w[N][N];
int n, m;
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; ++ i)
{
cin >> s[i];
for (int j = 1; j <= s[i]; ++ j)
{
cin >> v[i][j] >> w[i][j];
}
}
for (int i = 1; i <= n; ++ i)
for (int j = m; j >= 0; -- j)
for (int k = 1; k <= s[i]; ++ k)
if (v[i][k] <= j) f[j] = max(f[j], f[j - v[i][k]] + w[i][k]);
cout << f[m] << endl;
return 0;
}