一、问题描述
有n 个物品,它们有各自的重量和价值,现有给定容量的背包,
如何让背包里装入的物品具有最大的价值总和?
二、动态规划原理
动态规划是将大问题分解成许多小问题,通过寻找大问题与小问
题之间的递推关系,解决一个一个小问题,最终达到解决原问题
的目的。通过填表将每个子问题的解记录下来,在新问题里需要
用到时可以直接提取,节约时间。
例题
四个物体,背包容量为8.
i | 1 | 2 | 3 | 4 |
---|---|---|---|---|
w(体积) | 2 | 3 | 4 | 5 |
v(价值) | 3 | 4 | 5 | 6 |
解题过程:
1、创建一个新的变量a,a的值可以为1或0;
2、建立关系模型,max(v1a+v2a+v3a+v4a),a的值可以为1或0;
3、v1w1a+v2w2a+v3w3a+v4w4a<=背包容量,a的值可以为1或0;
4、本题有两个变量i(物品的个数),j(背包的容量);(i,j都是变化的)
5、那么定义V(i,j)为当前背包容量j,前i个物品最佳组合对应的价值
6、寻找递推关系,一件商品存在两种可能性:
第一,当前包的容量比该商品体积小,那么此时无法取到,即V(i,j)=V(i-1,j);
第二,当前包的容量比该商品大,但是取还是不取,当然是选择价值大的啦。
V(i,j)=max(V(i-1,j),V(i-1,j-w(i))+V(i));
7、创建二维列表依次遍历每一个物品就好了。
i/j | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
1 | 0 | 0 | 3 | 3 | 3 | 3 | 3 | 3 | 3 |
2 | 0 | 0 | 3 | 4 | 4 | 7 | 7 | 7 | 7 |
3 | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 9 | 9 |
4 | 0 | 0 | 3 | 4 | 5 | 7 | 8 | 9 | 10 |
分析
(1) 如,i=1,j=1,w(1)=2,v(1)=3,有j<w(1),故V(1,1)=V(1-1,1)=0;
(2) 又如i=1,j=2,w(1)=2,v(1)=3,有j=w(1),
故V(1,2)=max{ V(1-1,2),V(1-1,2-w(1))+v(1) }=max{0,0+3}=3;
(3) 如此下去,填到最后一个,i=4,j=8,w(4)=5&#x