背包问题解析(三)-动态规划算法

一、题目:
        有N件物品和一个容量为V的背包。第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。
下面讲述的例子均先用具体的数字代入,即:eg:number=3,capacity=8
 
 
二、背包问题的解决过程
        在解决问题之前,为描述方便,首先定义一些变量:Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值,同时背包问题抽象化(X1,X2,…,Xn,其中 Xi 取0或1,表示第 i 个物品选或不选)。
1、建立模型,即求max(V1X1+V2X2+…+VnXn);
2、寻找约束条件,W1X1+W2X2+…+WnXn<capacity;
3、寻找递推关系式,面对当前商品有两种可能性:包的容量比该商品体积小,装不下,此时的价值与前i-1个的价值是一样的,即V(i,j)=V(i-1,j);
还有足够的容量可以装该商品,但装了也不一定达到当前最优价值,所以在装与不装之间选择最优的一个,即V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}。
其中V(i-1,j)表示不装,V(i-1,j-w(i))+v(i) 表示装了第i个商品,背包容量减少w(i),但价值增加了v(i);
由此可以得出递推关系式:
j<w(i) V(i,j)=V(i-1,j)
j>=w(i) V(i,j)=max{V(i-1,j),V(i-1,j-w(i))+v(i)}
 
 
三、填表处理:
首先初始化边界条件,V(0,j)=V(i,0)=0;
V(i,j):当前背包容量 j,前 i 个物品最佳组合对应的价值
v(0,j)表示当前容量为j,前0个物品最佳组合对应价值,显然应为0
v(j,0)表示当前容量为0,前j个物品最佳组合对应价值,显然亦应为0;
然后一行一行的填表:
如,i=1,j=1,w(1)=2,v(1)=3,有j<w(1),故V(1,1)=V(1-1,1)=0;
又如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;
如此下去,填到最后一个
 
四、python代码实现:
num=int(input("请输入可放的商品个数:"))
bag=int(input("请输入背包容量:"))
w=[]#容量表
v=[]#价值表
for i in range(num):
    str1=input("请分别输入每个商品的容量,与价值,以空格隔开:")
    w.append(int(str1.split(" ")[0]))
    v.append(int(str1.split(" ")[1]))
print("容量为",w)
print("体积为",v)
# 动态规划
#动态构建v模型(mum+1)*(bag+1),初始化全0
module=[[0 for i in range(bag+1)] for i in range(num+1)]
print("初始化:",module)
for i in range(1,num+1):
    for j in range(1,bag+1):
        if w[i-1]>j:#当第i次的物品容量小于背包容量,不拿,最大容量与上一次的相等
            module[i][j]=module[i-1][j]
        else:#否则,物品容量小于等于当年背包容量,可以选择放或不放,不放即上一次的背包
            module[i][j]=max(module[i-1][j],module[i-1][j-w[i-1]]+v[i-1])
for i in range(len(module)):
    print(module[i])
print("最大价值为:",module[num][bag])
结果展示:
 
五、算法分析:
    动态规划与分治法类似,都是把大问题拆分成小问题,通过寻找大问题与小问题的递推关系,解决一个个小问题,最终达到解决原问题的效果。但不同的是,分治法在子问题和子子问题等上被重复计算了很多次,而动态规划则具有记忆性,通过填写表把所有已经解决的子问题答案纪录下来,在新问题里需要用到的子问题可以直接提取,避免了重复计算,从而节约了时间,所以在问题满足最优性原理之后,用动态规划解决问题的核心就在于填表,表填写完毕,最优解也就找到。
    最优性原理是动态规划的基础,最优性原理是指“多阶段决策过程的最优决策序列具有这样的性质:不论初始状态和初始决策如何,对于前面决策所造成的某一状态而言,其后各阶段的决策序列必须构成最优策略”。
       
 
 
 
posted @ 2020-06-12 00:40  Mrwhite86  阅读(361)  评论(0编辑  收藏  举报