分组背包:有若干个商品的小组,每个小组里面有若干个商品,每一组只能选1或0个商品的背包问题。

#include<iostream>
using namespace std;
#define PII pair<int, int>
#define v first
#define w second
const int N = 110;
PII goods[N][N];
int f[N][N];
int s[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 >> goods[i][j].v >> goods[i][j].w;
}
for(int i = 1; i <= n; i ++)
for(int j = 1; j <= m; j ++){
for(int k = 0; k <= s[i]; k ++)
if(goods[i][k].v <= j)
f[i][j] = max(f[i][j], f[i - 1][j - goods[i][k].v] + goods[i][k].w);
}
cout << f[n][m];
}
等价变换代码
#include<iostream>
using namespace std;
#define PII pair<int, int>
#define v first
#define w second
const int N = 110;
PII goods[N][N];
int f[N];
int s[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 >> goods[i][j].v >> goods[i][j].w;
}
for(int i = 1; i <= n; i ++)
for(int j = m; j >= 1; j --){
for(int k = 0; k <= s[i]; k ++)
if(goods[i][k].v <= j)
f[j] = max(f[j], f[j - goods[i][k].v] + goods[i][k].w);
}
cout << f[m];
}