特征
有N 件物品和一个容量为V 的背包。第i 件物品的费用是c [ i ],价值是w [ i ]。这些物品被划分为若干组,每组中的物品互相冲突,最多选一件。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
板子
for (int i = 1;i <= n;i++) {
cin >> s;
for (int j = 1;j <= s;j++) {
cin >> c[j] >> w[j];
}
for (int j = v;j >= 0;j--) {
for (int k = 1;k <= s;k++) {
if (j > c[k]) {
dp[j] = max(dp[j], dp[j - c[k]] + w[k]);
}
}
}
}
板子题1
ACcode
#include<bits/stdc++.h>
using namespace std;
const int M = 1e5 + 9;
int dp[M], c[M], w[M];
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int n, v;cin >> n >> v;
int s = 0;
for (int i = 1;i <= n;i++) {
cin >> s;
for (int j = 1;j <= s;j++) {
cin >> c[j] >> w[j];
}
for (int j = v;j >= 0;j--) {
for (int k = 1;k <= s;k++) {
if (j >= c[k]) {
dp[j] = max(dp[j], dp[j - c[k]] + w[k]);
}
}
}
}
cout << dp[v];
return 0;
}