1. 程式人生 > >動態規劃一:01背包問題

動態規劃一:01背包問題

max In nat 情況 def 初始化 ons 過濾 有關

最近碰到很多有關於動態規劃的問題,總結一下:

一、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背包問題