給定n個元素的重量和其對應的價值,將這些物品放在乙個容量為w的揹包中,並使得總價值最大。
陣列val [0 . . n - 1]和wt [0 . . n - 1],它們分別代表價值和重量。 總重量w代表揹包容量,
之前也寫過0-1揹包問題:
今天看到了個遞迴的方法,挺簡潔的,記錄一下:
defknapsack(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
遞迴方法會出現子問題重複計算問題,可用以下方法解決:
defknapsack(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的揹包可以獲得的最大價值。則其狀態轉移方程...