当前位置:   article > 正文

二维背包(动态规划)

二维背包

dp[i][j] 表示当背包体积为 i,重量为 j 时能获得的最大总价值。对于每个物品 i,从背包容量和重量的最大值开始,倒序循环更新 dp 数组。更新公式为:dp[j][k] = max(dp[j][k], dp[j-v[i]][k-w[i]] + p[i]),即在放入当前物品和不放入当前物品两种情况中选择价值最大的方案。

代码如下:

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. int main() {
  4. int T;
  5. cin >> T;
  6. while (T--) {
  7. int n, C, L;
  8. cin >> n >> C >> L;
  9. // 分别存储每个物品的体积、重量和价值
  10. vector<int> v(n), w(n), p(n);
  11. for (int i = 0; i < n; i++) {
  12. cin >> v[i] >> w[i] >> p[i];
  13. }
  14. // 定义二维数组 dp,表示当背包体积为 i,重量为 j 时能获得的最大总价值
  15. vector<vector<int>> dp(C+1, vector<int>(L+1, 0));
  16. // 遍历每个物品,倒序更新 dp 数组
  17. for (int i = 0; i < n; i++) {
  18. // 从背包容量和重量的最大值开始循环,倒序更新 dp 数组
  19. for (int j = C; j >= v[i]; j--) {
  20. for (int k = L; k >= w[i]; k--) {
  21. // 更新公式为:dp[j][k] = max(dp[j][k], dp[j-v[i]][k-w[i]] + p[i])
  22. // 即在放入当前物品和不放入当前物品两种情况中选择价值最大的方案
  23. dp[j][k] = max(dp[j][k], dp[j-v[i]][k-w[i]] + p[i]);
  24. }
  25. }
  26. }
  27. // 输出 dp[C][L],即当背包容量为 C,重量为 L 时能获得的最大总价值
  28. cout << dp[C][L] << endl;
  29. }
  30. return 0;
  31. }

图解:

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号