【NEUOJ1906】 0-1背包问题 II

原题链接:01背包2(可能需要东北大学校园网)

题意:将N件物品放入最大容量为W的背包中,最大的价值是多少,其中每一件物品的价值为 \(v_i\),体积为 \(w_i\)

思路:该题与经典的01背包不同的点在于本题的物品最大体积很大,将物品最大体积作为背包容量不可行,所以本题我们可以换一种思路,将物品的最大价值作为背包容量,\(dp_i\) 内存放的是当价值为i时需要的最小体积,由此我们可以很轻松的推出该题的转移方程为

\[dp_i = min(dp_i,dp_{i - v_i}) \]

需要注意的是,本题的dp数组应初始化为极大值

代码如下:

点击查看代码
  dp[0] = 0;
  for(int i = 0; i < n; i++) {
    //注意01背包问题需要从大往小dp
    for(int j = 10000; j >= v[i]; j--) {
      dp[j] = min(dp[j], dp[j - v[i]] + w[i]);
    }
  }
  //从大往小第一个满足条件的i为最大价值
  for(int i = 10000; i >= 0; i--) {
    if(dp[i] <= W) {
      cout << i << endl;
      break;
    }
  }

posted @ 2022-05-23 21:47  fczhao  阅读(74)  评论(0)    收藏  举报