目录

  • 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]]