動態規劃一:01揹包問題

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

1、01揹包問題(python實現)數組

例:給定3個物品,揹包的容量爲50磅app

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

求揹包能裝下的最大價值code

求解表以下blog

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

 0     0價值     0價值       0價值       0價值      0價值        0價值io

 1      0價值    60價值     60價值      60價值    60價值      60價值class

 2     0價值     60價值    100價值    160價值    160價值    160價值import

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

 

下一章節:徹底揹包

相關文章
相關標籤/搜索