python 動態規劃 0 1揹包問題

2022-06-10 19:03:08 字數 1117 閱讀 5993

給定n個元素的重量和其對應的價值,將這些物品放在乙個容量為w的揹包中,並使得總價值最大。

陣列val [0 . . n - 1]和wt [0 . . n - 1],它們分別代表價值和重量。 總重量w代表揹包容量,

之前也寫過0-1揹包問題:

今天看到了個遞迴的方法,挺簡潔的,記錄一下:

def

knapsack(w,wt,val,n):

if n==0 or w==0:

return

0

if wt[n-1]>w:

return knapsack(w,wt,val,n-1)

else

:

return max(val[n-1]+knapsack(w-wt[n-1],wt,val,n-1),knapsack(w,wt,val,n-1))

val = [60, 100, 120]

wt = [10, 20, 30]

w = 50

"""val=[5,4,6,2]

wt=[2,4,5,3]

w=8"""

n =len(val)

print(knapsack(w , wt , val , n) )

輸出:220

遞迴方法會出現子問題重複計算問題,可用以下方法解決:

def

knapsack(w, wt, val, n):

k = [[0 for x in range(w+1)] for x in range(n+1)]

#build table k in bottom up manner

for i in range(n+1):

for w in range(w+1):

if i==0 or w==0:

k[i][w] =0

elif wt[i-1] <=w:

k[i][w] = max(val[i-1] + k[i-1][w-wt[i-1]], k[i-1][w])

else

: k[i][w] = k[i-1][w]

return k[n][w]

參考:

動態規劃 01揹包

最優二叉查詢樹.cpp 定義控制台應用程式的入口點。01揹包問題。include stdafx.h include include define n 3 the number of real node define m 10 using namespace std int tmain int arg...

01揹包動態規劃

0 1揹包 問題描述 乙個旅行者有乙個最多能用 m公斤的揹包,現在有 n件物品,它們的重量 分別是w1,w2 wn,它們的價值分別為 c1,c2,cn.若每種物品只有一 件求旅行者能獲得最大總價值。輸入格式 w 第一行 兩個整數,m 揹包容量,m 200 和n 物品數量,n 30 w第2.n 1 行...

0 1揹包(動態規劃)

題意 有n件物品和乙個容量為v的揹包。第i件物品的體積是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。基本思路 這是最基礎的揹包問題,特點是 每種物品僅有一件,可以選擇放或不放。用子問題定義狀態 即f i v 表示前i件物品恰放入乙個容量為v的揹包可以獲得的最大價值。則其狀態轉移方程...