【分组背包】
注:只是新手的笔记,慎看!!!欢迎大佬指错
给定 n 组物品,每组中有多件物品,但每组只能拿一件,求能拿的最大总价值

前置知识:01背包
从题目上看,分组背包和01背包区别在于每组中有多种物品,且只能拿一个
如此一来我们便可以想到在01背包的双重循环内,再填一个决策循环,事实上也只能这样写,时间复杂度难以优化
代码:
cpp
#include<bits/stdc++.h>
using namespace std;
const int N = 110;
int n, m, v[N][N], w[N][N], s[N], f[N];
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> s[i];
for (int j = 0; 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 = 0; 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;
}