01揹包打天下。

2022-07-08 01:00:14 字數 1264 閱讀 5269

01揹包三維!- i w 01

記憶化遞迴 , 從n-1號開始,考慮與不考慮

public int bestvalue(int w,int v,int n,int c)else

return math.max(a,b);}}

dp重量要作為陣列的下標。重點在這。要填滿。

我習慣的選與不選陣列

dp[i] [w] [1] 就是 當前物品在w重量下 選擇的最優解。

狀態轉移方程:

dp[i][w][0] = math.max(dp[i-1][w][0],dp[i-1][w][1]) //不選

dp[i][w][1] = values[i] + math.max(dp[i-1][w-weights[i]][0],dp[i-1][w-weights[i]][1])//選
很多我習慣的都可以合併。

二維dp 選與不選可合併。

//f(i,c) = max( f(i-1,c) , v(i)+f(i-1,c-w(i) )   //狀態轉移方程

dp[i][w] = dp[i-1][w];// 不選

if(w>=weights[i])

空間優化

f(i,c) = max( f(i-1,c) , v(i)+f(i-1,c-w(i) ) 狀態轉移方程

第i行只依賴於i-1行。 ,只需要保留兩行資料。

不斷的覆蓋前一行內容。因為後面用不到了。

使用奇偶行即可。i%2

for(int i =1;i=weights[i])

}}

空間再優化 二維轉1維

思考,每次第二行更新的時候 只用到了第一行對應位置 左邊的資料

那麼我們就用一行,到第二個物品的時候,從右往左更新,那麼就可以不斷的重新整理同一行即可。

for(int i =1;i=1;w--)

}}return dp[c];

題目昇華,加上體積 ,那麼多加一維就ok

uva 624 CD 0 1揹包列印路徑

include include include include using namespace std const int inf 1000000 define n 1000000 int dp 22 n int a 22 int n,t void printf path vector v,int ...

0 1揹包列印路徑(遞迴和非遞迴版本)

簡單的0 1揹包列印路徑問題,我們可以記錄乙個p陣列來判斷,當前物品是否被選中,最後按照記錄輸出,注意是逆序。include includeint main j m for i n i 1 i if p i j printf sum d n s m return 0 接下來的遞迴版本,基本思想是一樣...

揹包 01揹包

01揹包 有n種物品與承重為m的揹包。每種物品只有一件,每個物品都有對應的重量weight i 與價值value i 求解如何裝包使得價值最大。dp i,v 表示前i個物體 包括第i個 面對容量為v的揹包的最大價值,c i 代表物體i的重量,w i 代表物體i的價值 如果第i個物體不放入揹包,則揹包...