01揹包中揹包裝滿和不裝滿

2021-08-17 10:28:34 字數 1343 閱讀 2987

揹包:

有n 種不同的物品,每個物品有兩個屬性,

v體積,c價值,現在給乙個體積為 m 的揹包,問

最多可帶走多少價值的物品。

狀態轉移方程  dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+c[i])

dp[i-1][j]表示不放第i件物品的最大價值,dp

[i-1][j-v[i]]+c[i]表示放第i件物品的最大價值;

[i-1][j-v[i]]這個表示將    前i-1件物品放入空間為  j-v[i] 的揹包中的最大價值。為啥要j-v[i] ?因為要放第i件物品,所以所剩空間就剩了      j-v[i].  所以

[i-1][j-v[i]]+c[i]就表示

放第i件物品的最大價值。

第(1)種情況:揹包不一定裝滿。

dp[j]記錄的是前i件物品放入空間為j的揹包中的最大價值!!!

要在一開始,讓dp[1001]中的每個值為 0;

計算順序是:從右往左,自上而下:因為每個物品只能放一次,前面先放的物品所占空小的會影響占空大的

(2)揹包剛好裝滿    

計算順序是:從右往左,自上而下。注意初始值,其中-inf表示負無窮(codeblocks中沒有直接表示無窮的符號,inf是自己定義的)

揹包剛好裝滿需要注意:

要把f[j]  (表示剛好裝滿的最大價值) 這樣初始化!

f[0]=0; f[1~n]=負無窮!

因為這樣就能是那些能夠恰好裝滿揹包的物品的值為正數!而那些不能恰好裝滿揹包的物品 的值就為負數。

這樣就容易區分了。

這樣dp(n)(揹包最多承重) == inf話,說明裝不滿,裝滿的話 如果要求裝滿最多的價值,直接輸出dp【n】

以下是是用一維陣列寫的

以下是二維陣列寫的。

二維陣列的方法執行結果是這樣的,我特意輸出了每個值…… 

與前面的**完全一樣! 我把負無窮規定為-100,所以結果中的負數就是代表上面**中的   -inf

01揹包中是否揹包裝滿問題

揹包 有n 種不同的物品,每個物品有兩個屬性,v體積,c價值,現在給乙個體積為 m 的揹包,問 最多可帶走多少價值的物品。狀態轉移方程 dp i j max dp i 1 j dp i 1 j v i c i dp i 1 j 表示不放第i件物品的最大價值,dp i 1 j v i c i 表示放第...

完全揹包(裝滿)模板

時間限制 3000 ms 記憶體限制 65535 kb 難度 4 描述 直接說題意,完全揹包定義有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的體積是c,價值是w。求解將哪些物品裝入揹包可使這些物品的體積總和不超過揹包容量,且價值總和最大。本題要求是揹包恰好裝滿揹包時,求出最大價...

soj 3300 揹包裝滿(完全揹包)

soj3300 stockholm coins 簡介題意 有n種硬幣,取錢,取多少才能把所有硬幣種類都取齊,即,每種至少取一枚的最少取得錢數是多少。分析 如果說把所有種類錢幣都取出來的最小值,那不就是所有幣種幣值之和嗎?題目中也沒說有其他面額的錢呀,或者紙幣啥的?所以預設滿足題意輸出sum就行了。然...