分组背包和01背包的类似之处:
选(只能选一次)还是不选
不同之处在于:
分组背包在每组中是否选其中的某样物品。
01背包是对每样物品(每样物品只有一个)来进行是否选择。
完全背包是对每样物品(每样物品有无限多个)来进行选择(不选或者选1次,或者2次,…,或者∞次)
多重背包是对每样物品(每样物品只有S个)来进行选择(不选或者选1次,或者2次,…,或者s次)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 320;
int f[N];
int v[N][N],w[N][N];//第几组的第几件物品,第几组的第几件物品的价值。
int s[N];//第几组
int n,m;
int main(){
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++){
cin >> s[i];
//j从0开始或1开始,都可以。相应得k从0开始或者1开始
for(int j = 1; j <= s[i]; j++){//第s[i]组物品中 每件物品的体积和价值
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;
}