2 条题解
-
0
单独的混合背包问题,三重循环题解:
#include <iostream> #include <vector> using namespace std; int main() { int n, C; cin >> n >> C; vector<int> w(n), v(n), k(n); // 物品的重量、价值、数量限制 for (int i = 0; i < n; ++i) { cin >> w[i] >> v[i] >> k[i]; } vector<int> dp(C + 1, 0); // dp数组,表示容量为j时的最大价值 // 遍历每个物品 for (int i = 0; i < n; ++i) { // 遍历背包容量,从大到小,确保每个物品只能选择有限次 for (int j = C; j >= 0; --j) { // 遍历物品的选择次数 for (int x = 1; x <= k[i] && j >= x * w[i]; ++x) { dp[j] = max(dp[j], dp[j - x * w[i]] + x * v[i]); } } } // 输出最终结果 cout << dp[C] << endl; return 0; } -
0
单独的混合背包问题,不是这题题解:
#include <iostream> #include <vector> using namespace std; int main() { int n, C; // n 为物品数量,C 为背包容量 cin >> n >> C; vector<int> w(n), v(n), k(n); // 输入每个物品的重量、价值和数量限制 for (int i = 0; i < n; ++i) { cin >> w[i] >> v[i] >> k[i]; } // dp数组,表示容量为j时的最大价值 vector<int> dp(C + 1, 0); // 遍历每个物品 for (int i = 0; i < n; ++i) { int count = k[i]; // 使用二进制拆分,将多重背包转化为多个0/1背包问题 for (int b = 1; count > 0; b <<= 1) { int num = min(b, count); count -= num; // 更新dp数组,这里从大到小遍历,确保物品只使用一次 for (int j = C; j >= num * w[i]; --j) { dp[j] = max(dp[j], dp[j - num * w[i]] + num * v[i]); } } } // 输出最终结果,即最大价值 cout << dp[C] << endl; return 0; }
- 1
信息
- ID
- 420
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- 递交数
- 18
- 已通过
- 10
- 上传者