二维:
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 110;
int N, V;
int s[MAXN], v[MAXN][MAXN], w[MAXN][MAXN];
int f[MAXN][MAXN];
int main() {
cin >> N >> V;
for(int i = 1; i <= N; ++i) {
cin >> s[i];
for(int j = 1; j <= s[i]; ++j) {
cin >> v[i][j];
cin >> w[i][j];
}
}
for(int i = 1; i <= N; ++i) {
for(int k = 0; k <= V; ++k) {
f[i][k] = f[i - 1][k];
for(int j = 1; j <= s[i]; ++j) {
if(v[i][j] <= k) f[i][k] = max(f[i][k], f[i - 1][k - v[i][j]] + w[i][j]);
}
}
}
cout << f[N][V];
}
注意:01背包问题中,f[i][k] = max(f[i - 1][k], f[i - 1][k - v[i][j]] + w[i][j])
分组背包问题中,f[i][k] = max(f[i][k], f[i - 1][k - v[i][j]] + w[i][j]);
01背包问题是在选与不选中取最大
分组背包问题是在每组各个物品之间取最大,
等价为if(f[i - 1][k - v[i][j]] + w[i][j] > f[i][k]) f[i][k] = f[i - 1][k - v[i][j]] + w[i][j])
形式很像,但其实操作意图截然不同。
一维:
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN = 110;
int N, V;
int s[MAXN], v[MAXN][MAXN], w[MAXN][MAXN];
int f[MAXN];
int main() {
cin >> N >> V;
for(int i = 1; i <= N; ++i) {
cin >> s[i];
for(int j = 1; j <= s[i]; ++j) {
cin >> v[i][j];
cin >> w[i][j];
}
}
for(int i = 1; i <= N; ++i) {
for(int k = V; k >= 0; --k) {
for(int j = 1; j <= s[i]; ++j) {
if(v[i][j] <= k) f[k] = max(f[k], f[k - v[i][j]] + w[i][j]);
}
}
}
cout << f[V];
}