目录
- 1 博客内容
- 2 程序思路
- 3 源程序
- 4 运行数据
1 博客内容
国庆假期闲暇时间阅读背包问题的博客,“动态规划之01背包问题(最易理解的讲解)”。文中使用actionscript3 的代码,这里使用Python码一遍。
解决问题:商场开业酬宾,幸运顾客随意挑选使用幸运盒子带走。设定有个幸运盒子能装100g物品。戒指20g→价值60000元,项链20g→价值30000元,手镯60g→价值50000元,手链50g→价值40000元,耳坠40g→价值60000元。怎么选择使顾客获得金额最大化。
2 程序思路
先介绍思路:
0. 物品重量列表Weight=[2,2,6,5,4],价值列表Value=[6,3,5,4,6],背包承载重量BagSize=10;
1. 生成5行(物品数量)11列(背包容量)矩阵,初始赋值为0;
2. 当背包容量i=1,判断背包容量 i 不能否承载物品重量Weight[j],赋值为0。此时矩阵中:
[0][0]=0; [0][1]=0
[1][0]=0; [1][1]=0
[2][0]=0; [2][1]=0
[3][0]=0; [3][1]=0
[4][0]=0; [4][1]=0
3. 当i=2,判断背包容量能否承载物品重量:
j=0,物品重量Item_Weight[j]为2,可承载,此时矩阵中:[0][2]=6;
j=1,物品重量Item_Weight[j]为2,可承载,假设去除原有Item_Weight[0]更换为Item_Weight[1],Item_Inbag=3。矩阵[1][2]=max([0][2],Item_Inbag)=6。此时矩阵中:
[0][0]=0; [0][1]=0; [0][2]=6
[1][0]=0; [1][1]=0; [1][2]=6
[2][0]=0; [2][1]=0
[3][0]=0; [3][1]=0
[4][0]=0; [4][1]=0
4. 继续循环……
5. 最终实现转换方程:f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }。
3 源程序
Python(3.7版)代码如下:
"""
名称: Package.py
作者: Morven_Xie
版本: 1.0
时间: 2020/10/9 22:04
功能: 最小背包容量实现最大价值
简介: 使用比较算法动态规划背包容量下最大价值
Email: morven_xie@163.com
"""
def Package(Item_Weight,Item_Value,Bag_Size):
Bag_Matrix=[]
n=len(Item_Value)
Iten_Inbag=0
Bag_Matrix=[[0 for j in range(Bag_Size)] for i in range(n)]
for i in range(1,Bag_Size):
print('背包承载重量为:'+str(i))
for j in range(0, n):
if Item_Weight[j]>i:
print(' 物品重量'+str(Item_Weight[j])+'大于'+'背包承载重量'+str(i)+'背包装不下')
if j==0:
Bag_Matrix[j][i]=0
print(' '+str(j) + ',' + str(i) +','+ 'Bag_Matrix[j][i]='+str(Bag_Matrix[j][i]))
else:
Bag_Matrix[j][i]=Bag_Matrix[j-1][i]
print(' '+str(j) + ',' + str(i) +','+ 'Bag_Matrix[j][i]='+str(Bag_Matrix[j][i]))
else:
Item_Inbag=Bag_Matrix[j-1][i]
print(' 物品重量'+str(Item_Weight[j])+'不大于'+'背包承载重量'+str(i)+'将物品放置背包后')
if j==0:
Bag_Matrix[j][i]=Item_Value[j]
print(' 背包总价值为'+str(Bag_Matrix[j][i]))
print(' '+str(j) + ',' + str(i) + ',' + 'Bag_Matrix[j][i]=' + str(Bag_Matrix[j][i]))
else:
Item_Inbag =Bag_Matrix[j-1][i-(Item_Weight[j-1])]+Item_Value[j]
print(' 取出重量'+str(Item_Weight[j-1])+'后,背包内总价值'+str(Bag_Matrix[j-1][i-(Item_Weight[j-1])])+'.增加当前物品重量和价值:'+str(Item_Weight[j])+','+str(Item_Value[j]))
Bag_Matrix[j][i]=max(Bag_Matrix[j-1][i],Item_Inbag)
print(' '+str(j) + ',' + str(i) + ',' + 'Bag_Matrix[j][i]=' + str(Bag_Matrix[j][i]))
print(' 背包最优总价值为'+str(Bag_Matrix[j][i]))
print(Bag_Matrix)
if __name__ == '__main__':
Weight=[2,2,6,5,4]
Value=[6,3,5,4,6]
BagSize=10
Package(Weight,Value,BagSize)
4 运行数据
运行结果:
- 背包承载重量为:1
物品重量2大于背包承载重量,1背包装不下.
0,1,Bag_Matrix[j][i]=0
物品重量2大于背包承载重量,1背包装不下.
1,1,Bag_Matrix[j][i]=0
物品重量6大于背包承载重量,1背包装不下.
2,1,Bag_Matrix[j][i]=0
物品重量5大于背包承载重量,1背包装不下.
3,1,Bag_Matrix[j][i]=0
物品重量4大于背包承载重量,1背包装不下.
4,1,Bag_Matrix[j][i]=0 - 背包承载重量为:2
物品重量2不大于背包承载重量,2将物品放置背包后,
背包总价值为6
0,2,Bag_Matrix[j][i]=6
物品重量2不大于背包承载重量,2将物品放置背包后,
取出重量2后,背包内总价值0.增加当前物品重量和价值:2,3
1,2,Bag_Matrix[j][i]=6
背包最优总价值为6
物品重量6大于背包承载重量,2背包装不下.
2,2,Bag_Matrix[j][i]=6
物品重量5大于背包承载重量,2背包装不下.
3,2,Bag_Matrix[j][i]=6
物品重量4大于背包承载重量,2背包装不下.
4,2,Bag_Matrix[j][i]=6 - 背包承载重量为:3
物品重量2不大于背包承载重量,3将物品放置背包后,
背包总价值为6
0,3,Bag_Matrix[j][i]=6
物品重量2不大于背包承载重量,3将物品放置背包后,
取出重量2后,背包内总价值0.增加当前物品重量和价值:2,3
1,3,Bag_Matrix[j][i]=6
背包最优总价值为6
物品重量6大于背包承载重量,3背包装不下.
2,3,Bag_Matrix[j][i]=6
物品重量5大于背包承载重量,3背包装不下.
3,3,Bag_Matrix[j][i]=6
物品重量4大于背包承载重量,3背包装不下.
4,3,Bag_Matrix[j][i]=6 - 背包承载重量为:4
物品重量2不大于背包承载重量,4将物品放置背包后,
背包总价值为6
0,4,Bag_Matrix[j][i]=6
物品重量2不大于背包承载重量,4将物品放置背包后,
取出重量2后,背包内总价值6.增加当前物品重量和价值:2,3
1,4,Bag_Matrix[j][i]=9
背包最优总价值为9
物品重量6大于背包承载重量,4背包装不下.
2,4,Bag_Matrix[j][i]=9
物品重量5大于背包承载重量,4背包装不下.
3,4,Bag_Matrix[j][i]=9
物品重量4不大于背包承载重量,4将物品放置背包后,
取出重量5后,背包内总价值0.增加当前物品重量和价值:4,6
4,4,Bag_Matrix[j][i]=9
背包最优总价值为9 - 背包承载重量为:5
物品重量2不大于背包承载重量,5将物品放置背包后,
背包总价值为6
0,5,Bag_Matrix[j][i]=6
物品重量2不大于背包承载重量,5将物品放置背包后,
取出重量2后,背包内总价值6.增加当前物品重量和价值:2,3
1,5,Bag_Matrix[j][i]=9
背包最优总价值为9
物品重量6大于背包承载重量,5背包装不下.
2,5,Bag_Matrix[j][i]=9
物品重量5不大于背包承载重量,5将物品放置背包后,
取出重量6后,背包内总价值0.增加当前物品重量和价值:5,4
3,5,Bag_Matrix[j][i]=9
背包最优总价值为9
物品重量4不大于背包承载重量,5将物品放置背包后,
取出重量5后,背包内总价值0.增加当前物品重量和价值:4,6
4,5,Bag_Matrix[j][i]=9
背包最优总价值为9 - 背包承载重量为:6
物品重量2不大于背包承载重量,6将物品放置背包后,
背包总价值为6
0,6,Bag_Matrix[j][i]=6
物品重量2不大于背包承载重量,6将物品放置背包后,
取出重量2后,背包内总价值6.增加当前物品重量和价值:2,3
1,6,Bag_Matrix[j][i]=9
背包最优总价值为9
物品重量6不大于背包承载重量,6将物品放置背包后,
取出重量2后,背包内总价值9.增加当前物品重量和价值:6,5
2,6,Bag_Matrix[j][i]=14
背包最优总价值为14
物品重量5不大于背包承载重量,6将物品放置背包后,
取出重量6后,背包内总价值0.增加当前物品重量和价值:5,4
3,6,Bag_Matrix[j][i]=14
背包最优总价值为14
物品重量4不大于背包承载重量,6将物品放置背包后,
取出重量5后,背包内总价值0.增加当前物品重量和价值:4,6
4,6,Bag_Matrix[j][i]=14
背包最优总价值为14 - 背包承载重量为:7
物品重量2不大于背包承载重量,7将物品放置背包后,
背包总价值为6
0,7,Bag_Matrix[j][i]=6
物品重量2不大于背包承载重量,7将物品放置背包后,
取出重量2后,背包内总价值6.增加当前物品重量和价值:2,3
1,7,Bag_Matrix[j][i]=9
背包最优总价值为9
物品重量6不大于背包承载重量,7将物品放置背包后,
取出重量2后,背包内总价值9.增加当前物品重量和价值:6,5
2,7,Bag_Matrix[j][i]=14
背包最优总价值为14
物品重量5不大于背包承载重量,7将物品放置背包后,
取出重量6后,背包内总价值0.增加当前物品重量和价值:5,4
3,7,Bag_Matrix[j][i]=14
背包最优总价值为14
物品重量4不大于背包承载重量,7将物品放置背包后,
取出重量5后,背包内总价值6.增加当前物品重量和价值:4,6
4,7,Bag_Matrix[j][i]=14
背包最优总价值为14 - 背包承载重量为:8
物品重量2不大于背包承载重量,8将物品放置背包后,
背包总价值为6
0,8,Bag_Matrix[j][i]=6
物品重量2不大于背包承载重量,8将物品放置背包后,
取出重量2后,背包内总价值6.增加当前物品重量和价值:2,3
1,8,Bag_Matrix[j][i]=9
背包最优总价值为9
物品重量6不大于背包承载重量,8将物品放置背包后,
取出重量2后,背包内总价值9.增加当前物品重量和价值:6,5
2,8,Bag_Matrix[j][i]=14
背包最优总价值为14
物品重量5不大于背包承载重量,8将物品放置背包后,
取出重量6后,背包内总价值6.增加当前物品重量和价值:5,4
3,8,Bag_Matrix[j][i]=14
背包最优总价值为14
物品重量4不大于背包承载重量,8将物品放置背包后,
取出重量5后,背包内总价值6.增加当前物品重量和价值:4,6
4,8,Bag_Matrix[j][i]=14
背包最优总价值为14 - 背包承载重量为:9
物品重量2不大于背包承载重量,9将物品放置背包后,
背包总价值为6
0,9,Bag_Matrix[j][i]=6
物品重量2不大于背包承载重量,9将物品放置背包后,
取出重量2后,背包内总价值6.增加当前物品重量和价值:2,3
1,9,Bag_Matrix[j][i]=9
背包最优总价值为9
物品重量6不大于背包承载重量,9将物品放置背包后,
取出重量2后,背包内总价值9.增加当前物品重量和价值:6,5
2,9,Bag_Matrix[j][i]=14
背包最优总价值为14
物品重量5不大于背包承载重量,9将物品放置背包后,
取出重量6后,背包内总价值6.增加当前物品重量和价值:5,4
3,9,Bag_Matrix[j][i]=14
背包最优总价值为14
物品重量4不大于背包承载重量,9将物品放置背包后,
取出重量5后,背包内总价值9.增加当前物品重量和价值:4,6
4,9,Bag_Matrix[j][i]=15
背包最优总价值为15 - 背包承载重量为:10
物品重量2不大于背包承载重量,10将物品放置背包后,
背包总价值为6
0,10,Bag_Matrix[j][i]=6
物品重量2不大于背包承载重量,10将物品放置背包后,
取出重量2后,背包内总价值6.增加当前物品重量和价值:2,3
1,10,Bag_Matrix[j][i]=9
背包最优总价值为9
物品重量6不大于背包承载重量,10将物品放置背包后,
取出重量2后,背包内总价值9.增加当前物品重量和价值:6,5
2,10,Bag_Matrix[j][i]=14
背包最优总价值为14
物品重量5不大于背包承载重量,10将物品放置背包后,
取出重量6后,背包内总价值9.增加当前物品重量和价值:5,4
3,10,Bag_Matrix[j][i]=14
背包最优总价值为14
物品重量4不大于背包承载重量,10将物品放置背包后,
取出重量5后,背包内总价值9.增加当前物品重量和价值:4,6
4,10,Bag_Matrix[j][i]=15
背包最优总价值为15
[[0, 0, 6, 6, 6, 6, 6, 6, 6, 6, 6], [0, 0, 6, 6, 9, 9, 9, 9, 9, 9, 9], [0, 0, 6, 6, 9, 9, 14, 14, 14, 14, 14], [0, 0, 6, 6, 9, 9, 14, 14, 14, 14, 14], [0, 0, 6, 6, 9, 9, 14, 14, 14, 15, 15]]