动态规划一:01背包问题

Posted qfdxxdr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划一: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]) 

 

下一章节:完全背包

以上是关于动态规划一:01背包问题的主要内容,如果未能解决你的问题,请参考以下文章

数据结构与算法|讲解|动态规划一脸懵?看完之后轻松掌握!

动规基础——01背包问题(背包问题Ⅱ)

动规讲解基础讲解一——01背包(模板)

算法动态规划 ④ ( 动态规划分类 | 坐标型动态规划 | 前缀划分型动态规划 | 前缀匹配型动态规划 | 区间型动态规划 | 背包型动态规划 )

算法动态规划 ④ ( 动态规划分类 | 坐标型动态规划 | 前缀划分型动态规划 | 前缀匹配型动态规划 | 区间型动态规划 | 背包型动态规划 )

正整数分组(动态规划,但我用的是枚举)