揹包:
有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就行了。然...