揹包問題 0 1揹包 初學(一)

2021-09-28 11:44:52 字數 1624 閱讀 1515

0-1 揹包問題;如果給你容量為v的揹包讓你盡可能的使揹包價值最大,

給出n個物品 每個物品對於質量 和價值 。

思路如下

這個問題的關鍵在於是放這個物品還是不放這個物品,而對 i 個物品的問題 又可以 轉化為 i-1 個物品的問題 在對 第 i 個物品上的決策 即對第i 個物品取還是不取;

dp[i][j]表示 在 容量為 j 下的最大價值 i 則是對應 i 個物品

對於 i+1 個物品 裝了的話 價值就變成 dp[i-1][j-m]+value ;

不裝的話 價值就等於 dp[i][j]

所以 dp[i][j] =( dp[i-1][j],dp[i-1][j-m]+value)

把問題轉為 對第i個物品的決策問題 。

#include

#include

using namespace std ;

int dp[

202]

[5002];

intmain()

else dp[i]

[j]= dp[i-1]

[j];}}

printf

("%d\n"

,dp[n]

[m])

;return0;

}

一維陣列實現0-1 揹包問題 , 在於觀察 二維陣列的迴圈 發現 每次運算 只是 從dp[i][j->ci]

i 在其中的作用可以忽略 , 用外層迴圈來表示 但是為了防止 i-1 的情況唄覆蓋 即 如果 j 從 ci -> v 那麼可能 高階的 j- ci 會覆蓋 低階的 j 為了避免這種情況所以 j 因該從 v -> ci 避免覆蓋 保證 dp[j-ci]是上一次的結果

for

( i =

1; i<=n ; i++

)

0-1 揹包問題中 又有 一種 恰好裝滿揹包時價值最大的問題

這問題和普通0-1揹包的解法類似,只是在初始化不同, 恰好裝滿問題的初始化是把dp[1->v] 設定為非常小的數 一般設定為-int_max 。

而dp[0] = 0 , 剩下的操作與一維陣列實現的0-1揹包解法一樣。為何如此。個人理解是,初始化的時候只有 0 容量的 揹包處於裝滿狀態即為 0 而後的揹包處於未裝滿狀態, 而後面的揹包如果想得出結果即 不為負數 那必須由 0 推出 這就保證 j - temp_m = 0 這就多出有效值 即裝滿的 記住 j1 當 j-temp_m = j1 時候 就相當於裝滿了 j1+temp_m 的揹包 。。。以此類推,為何要設定很小的數 ,應該是為了判斷最後能不能恰好裝滿

當最後dp[v]<0 則說明 不存在解

否則存在解 ;

#include#define int_min -999999

#define max_v 100

int dp[max_v];

int main()

return 0 ;

} /*

恰好裝滿時的最大價值 的解法 和 不超過容量的最大價值的解法類似

只是初始值 不同 恰好裝滿的初始值是負數 恰好裝滿的結果一定由 0 推導出來

所以如果最終 dp[v] 小於 0 則不存在解 反之即為所求解

*/

揹包問題(一) 0 1揹包問題

揹包問題有多種,比如 問題1 物品受限揹包,第i種物品最多取ni個 問題2 0 1揹包,本文即將介紹,xi 0或者1,i 1 2 3.n 問題3 多揹包問題,m個揹包,揹包j裝入最大重量bj,j 1 2 3.m,在滿足所有揹包重量約束 條件下使得裝入物品價值最大 問題4 二維揹包,每件物品有wi和體...

揹包問題 01揹包

有n件物品和乙個容量為v的揹包。第i件物品的重量是c i 價值是w i 求解將哪些物品裝入揹包可使價值總和最大。01揹包中的 01 就是一種物品只有1件,你可以選擇放進去揹包即1,也可以選擇不放入揹包中即0。include include using namespace std const int ...

揹包問題(01揹包)

1085 揹包問題 在n件物品取出若干件放在容量為w的揹包裡,每件物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。input 第1行,2個整數,n和w中間用空格隔開。n為物品的數量,w為揹包的容量。1 n 100,1 w 10000...