给定n
种物品和一个背包,物品i的重量是w[i]
,其价值是v[i]
,所有物品的重量和价值都是非负的,背包的容量是C
。我们限定每种物品只能选择0个或者1个。问应该如何选择装入背包的物品,使得装入背包中物品的总价值最大?
解题思路:
最终的目标是在总重量不超过C
的前提下,使得总价值最高。在总重量不超过Y(Y<=C)
的前提下,我们将前i种物品的总价值所能达到的最高价值定义为value[i][Y]
,由此我们可以得到这个问题的最优解与子问题的最优解相同(最优子结构性质),可用动态规划求解。
由上面的叙述可知:
value[0][Y]=0
0<=Y<=C
value[i][0]=0
1<=i<=n
当w[i]>Y
时,value[i][Y]=value[i-1][Y]
(物品i
不能放入背包,所以总价值还是前一个物品放入时的价值。)
当w[i]<=Y
时,value[i][Y]=max(value[i-1][Y],value[i-1][Y-w[i]]+v[i]
。(value[i-1][Y]
表示不能放入,value[i-1][Y-w[i]]+v[i]
表示放入进去。然后在这两种情况中选取最大值。先把表填了,这样才能更好理解!表格如下:
接下来我们看看代码:
#include <iostream>
using