每组背包里边最多选一个
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
int v[N][N], w[N][N], s[N];
int dp[100010];
int main() {
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++) {
cin >> s[i];
for (int j = 1; j <= s[i]; j++) {
cin >> v[i][j] >> w[i][j];
}
}
memset(dp, 0, sizeof(dp));
for (int i = 1; i <= n; i++) { // 对于每组物品
for (int j = m; j >= 0; j--) { // 背包容量从大到小遍历
for (int k = 1; k <= s[i]; k++) {
if (j >= v[i][k]) {
dp[j] = max(dp[j], dp[j - v[i][k]] + w[i][k]);
}
}
}
}
cout << dp[m] << endl;
return 0;
}
3037

被折叠的 条评论
为什么被折叠?



