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個物體不放入揹包,則揹包...