• 动态规划一:01背包问题


    最近碰到很多有关于动态规划的问题,总结一下:

    一、01背包问题(python实现)

    例:给定3个物品,背包的容量为50磅

    物品1重10磅,价值60;物品2重20磅,价值100;物品3重30磅,价值120

    求背包能装下的最大价值

    求解表如下

    物品    0磅       10磅        20磅        30磅        40磅         50磅

     0     0价值     0价值       0价值       0价值      0价值        0价值

     1      0价值    60价值     60价值      60价值    60价值      60价值

     2     0价值     60价值    100价值    160价值    160价值    160价值

     3     0价值     60价值    100价值    160价值    180价值    220价值

    由上表可知最大容量的最大价值是220

    代码如下:

     1 def weight_goods(n, weight, w, v):
     2     #n是物品数
     3     #weight是背包容量
     4     #w列表是每个物品的体积
     5     #v列表是每个物品的价值
     6 
     7     #res1 = [[0 for j in range(weight+1)] for I in range(n+1)]   一步实现
     8     #三种物品选入背包的重量对应的价值res[i]是,物品res[i][j]是选入物品的价值,用0初始化二维数组
     9     res = []
    10     for I in range(n+1):
    11         for j in range(weight+2):
    12             a = [0]*j
    13         res.append(a)
    14     
    15     #当分别放入0,1,2,3物品的组合时,输出容量为0-50磅的价值
    16     for I in range(1, n+1):
    17         for j in range(0, weight+1):
    18             res[i][j] = res[i-1][j]
    19     
    20     #以下是状态转移方程:res[i][j] = max{res[i-1][j-w[i-1]]+v[i-1], res[i][j]}
    21     if j >= w[i-1] and res[i][j] < res[i-1][j-w[i-1]]+v[i-1]:
    22         res[i][j] = res[i-1][j-w[i-1]]+v[i-1]
    23 
    24     #以上得出背包最大容量下的最大价值是res[n][weight],以下通过排列组合得出所有可能组合的价值值
    25     #然后在判断容量不超过背包容量的情况下,过滤出与已知最大价值的值相等的组合,此组合就是装入背包的物品
    26     import itertools
    27     for i in range(len(w)+1):
    28         h = list(itertools.combinations(range(1, len(w)+1), i))
    29         for j in h:
    30             x = []
    31             y = []
    32             for z in j:
    33                 x.append(v[z-1])
    34                 y.append(w[z-1])
    35             if sum(x) == res[n][weight] and sum(y) <= 50;
    36                 for z in j:
    37                     print('', z, '个物品,', end='' )
    38       print('得到的最大价值=', res[n][weight])
    39 
    40 weight_goods(3, 50, [10,20,30], [60,100,120]) 

    下一章节:完全背包

  • 相关阅读:
    字符串类型
    数据类型之整型
    数据类型
    两个版本的区别
    变量
    DHCP
    MySQL数据库编译及入门
    NFS网络文件系统
    Rsync 数据同步
    互联网数据分享平台
  • 原文地址:https://www.cnblogs.com/qfdxxdr/p/9153120.html
Copyright © 2020-2023  润新知