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

2021-07-29 23:44:08 字數 852 閱讀 9329

揹包:

有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】

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 表示放第...

01揹包的變形問題 揹包恰好裝滿

在看本文之前建議先看一下我之前發過的01揹包詳解。在前面講到的01揹包問題中,現在我們把條件改為 求當揹包恰好裝滿時候取得的最大價值 這樣的問題其實本質上和原始的01揹包問題區別不大,我們只需要做出一點小小的調整。需要指出的是該問題其實可分為兩個問題。1 揹包能否恰好裝滿?2 如果能恰好裝滿,恰好裝...

動態規劃中揹包 裝滿問題

在一些揹包問題中要求會從不超過揹包最大容量變為恰好裝滿揹包,與前者的差別在於初始化的不同 合理運用inf 把dp maxn 全賦值為inf dp 0 0 如果dp n 0,則在容量為n時,揹包無法裝滿。恰好裝滿的dp n 有乙個具體值,而不是inf 為什麼要這麼做呢?通過畫圖製表可以得出,有些位置上...