演示示例
**version版本修改增加優化重疊子問題的解決
numcount = 0
#version 1
def maxval1(w, v, index, last):
"""得到最大價值
w為widght
v為value
index為索引
last為剩餘重量
"""global numcount
numcount = numcount + 1
#最底部
if index == 0:
#是否可以裝入
if w[index] <= last:
return v[index]
else:
return 0
#尋找可以裝入的分支
without_l = maxval1(w, v, index - 1, last)
#如果當前的分支大於約束
#返回歷史查詢的最大值
if w[index] > last:
return without_l
else:
#當前分支加入揹包,剪掉揹包剩餘重量,繼續尋找
with_l = v[index] + maxval1(w, v , index - 1, last - w[index])
#比較最大值
return max(with_l , without_l)
#version 2
def maxval2(memo , w, v, index, last):
"""得到最大價值
w為widght
v為value
index為索引
last為剩餘重量
"""global numcount
numcount = numcount + 1
try:
#以往是否計算過分支,如果計算過,直接返回分支的結果
return memo[(index , last)]
except:
#最底部
if index == 0:
#是否可以裝入
if w[index] <= last:
return v[index]
else:
return 0
#尋找可以裝入的分支
without_l = maxval2(memo , w, v, index - 1, last)
#如果當前的分支大於約束
#返回歷史查詢的最大值
if w[index] > last:
return without_l
else:
#當前分支加入揹包,剪掉揹包剩餘重量,繼續尋找
with_l = v[index] + maxval2(memo , w, v , index - 1, last - w[index])
#比較最大值
maxvalue = max(with_l , without_l)
#儲存memo[(index , last)] = maxvalue
return maxvalue
w = [5, 5, 1, 9 , 10 ,3, 8, 6, 4 , 2, 5, 5, 1, 9 , 10 ,3, 8, 6, 4 , 2]
v = [7, 7, 6, 5, 4, 8, 11, 4, 2, 3,7, 7, 6, 5, 4, 8, 11, 4, 2, 3]
print maxval1(w, v, len(w) - 1, 35) , "caculate count : ", numcount
numcount = 0
memo = {}
print maxval2(memo , w, v, len(w) - 1, 35) , "caculate count : ", numcount
計算結果
66 caculate count : 188174
66 caculate count : 1134
動態規劃 0 1 揹包問題 python
有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?number 4,capacity 8 在程式中用n表示物品數量,用j表示剩餘容量 w 0,2,3,4,5 表示重量 v 0,3,4,5,6 表示價值 列出模型遞推式 1 當當前剩餘容量小於物品重量時...
0 1揹包問題 動態規劃 python
i為物品索引,x為揹包中的剩餘容量 1 物品i不放入揹包中,解等於從0,1,2 i 1選取容量為x的物品價值,也就是 knapsack i x knapsack i 1 x 2 物品i 放入揹包中,knapsack i x 的解等於剩餘物品 0,1,2 i 1中選擇放入容量為 x si 的包中的價值...
python 動態規劃 0 1揹包問題
給定n個元素的重量和其對應的價值,將這些物品放在乙個容量為w的揹包中,並使得總價值最大。陣列val 0 n 1 和wt 0 n 1 它們分別代表價值和重量。總重量w代表揹包容量,之前也寫過0 1揹包問題 今天看到了個遞迴的方法,挺簡潔的,記錄一下 def knapsack w,wt,val,n if...