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...