分組背包:有若干個商品的小組,每個小組里面有若干個商品,每一組只能選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];
}