python 版 動態規劃 揹包問題演算法

2021-06-15 08:36:38 字數 2099 閱讀 1262

演示示例

**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...