0/1揹包問題:在能承受一定重量的揹包中,放入重量不同,價值不同的幾件物品,怎樣放能讓揹包中物品的價值最大?
比如,有三件物品重量w,價值v分別是
w=[5,3,2]
v=[9,7,8]
包的容量是5,也就是我們要求得
maxval=v1+v2+v3……
約束條件為:ws=w1+w2+w3……
我們的思路是,列舉出所有可能的放入揹包的選項,然後比較哪個價值大,這需要用到決策樹。
決策樹的思想是,用一組向量來描述當前的狀態,比如 [當前考慮的物品i, 當前揹包的空間w, 當前已獲得的價值v],
決策樹左兒子表示不選取當前物品np,右兒子表示選取當前物品p,首先遞迴到索引為最後乙個的物品,然後回溯,每回溯到乙個物品時候就比較選取當前物品和不選取當前物品哪個更有價值
07 without_i = maxval(w, v, i-1, ws)#用遞迴算出不選取當前物品時候價值
8if w[i] >ws:
9return
without_i
10else
:11 with_i = maxval(w, v, i-1, ws-w[i]) +v[i]#算出選取當前物品時候的價值
12return
max(without_i, with_i)
1314
15 w = [5, 3, 2]
16 v = [9, 7, 8]
17 val = maxval(w, v, 2, 5)
18print(val)
這個方法可以正確執行,但是耗時為o(2^n),所以當資料量增大時候,耗時會急劇增大,有什麼辦法可以減小耗時?同時列舉出所有可能得出結論?
這就用到動態規劃了
拿上面這個例子來說
當我們考慮第二個也就是最後乙個物品的時候,我們需要把第0個,第1個物品要不要選取考慮一次
當我們考慮第乙個兒子時候,也要把第零個物品要不要選取考慮一次
當物品非常多的時候,就造成了非常大的浪費
那麼,我們能不能每次考慮乙個物品之後,就把每種情況下的特徵和值記錄下來,以供以後考慮別的物品時候使用?
這就是動態規劃
在這個揹包問題中,我們可以使用(i,ws)來描述決策樹中每種情況,同時儲存對應的值。
1 memo={}2def
maxval(w, v, i, ws):
3try:4
return
memo[(i,ws)]
5except
keyerror:
6if i ==0:
7if w[i] <=ws:
8 memo[(i, ws)] =v[i]
9return
v[i]
10else
:11 memo[(i, ws)] =0
12return
013 without_i = maxval(w, v, i-1, ws)
14if w[i] >ws:
15 memo[(i, ws)] =without_i
16return
without_i
17else
:18 with_i = maxval(w, v, i-1, ws-w[i]) +v[i]
19 res =max(without_i, with_i)
20 memo[(i, ws)] =res
21return
res22
23 w = [5, 3, 2]
24 v = [9, 7, 8]
25 val = maxval(w, v, 2, 5)
26print(val)
python 0 1揹包問題(動態規劃)
0 1揹包問題 給定n種物品和乙個容量為c的揹包,物品的重量依次是 2,2,3,1,5,2,其價值依次是2,3,1,5,4,3,揹包問題是如何使選擇裝入揹包內的物品,使得裝入揹包中的物品的總價值最大。其中,每種物品只有全部裝入揹包或不裝入揹包兩種選擇。演算法 n 物品數量 int c 書包能承受的重...
0 1揹包問題python 0 1揹包問題1
鼓搗好久 終於了然了一些 0 1揹包問題描述 有乙個竊賊在偷竊一家商店時發現有n件物品,第i件物品價值為vi元,重量為wi,假設vi和wi都為整數。他希望帶走的東西越值錢越好,但他的揹包中之多只能裝下w磅的東西,w為一整數。他應該帶走哪幾樣東西?注 0 1揹包問題中 每件物品或被帶走,或被留下,需要...
動態規劃 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...