$\LARGE\color{orange}{刷题日记(算法提高课)}$
$f[i][j]$ 表示集合为:考虑前 $i$ 个物品组,当物品体积不超过 $j$ 时的所有选法,属性为价值的最大值
由于在每一个物品组内只能选择一个物品,因此我们可以将其看成 01 背包,在空间优化的时候按照 01 背包来进行优化即可
#include <iostream>
using namespace std;
const int N = 110;
int v[N][N], w[N][N], s[N];
int f[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 j = m; j >= 1; j--)//这里不需要控制j一定要大于某个体积,因为还没有对物品进行选择,下面会对j的范围进行限制
for(int k = 1; k <= s[i]; k++)
if(j >= v[i][k])
f[j] = max(f[j], f[j - v[i][k]] + w[i][k]);
}
cout << f[m] << endl;
return 0;
}