問題描述:
有n種物品,每種均有無窮多個。第i個物品的體積為vi,重量為wi。選一些物品裝到容量為c的揹包中,使得揹包內物品在總體積不超過c的前提下重量盡量大。
問題分析:
開乙個陣列f[i][j]表示前i種物品中選取若干件物品放入剩餘空間為j的揹包中所能得到的最大重量。
每種物品無窮個,所以還要有乙個k遍歷從0到「最大」。
f[i][j]=max(f[i][j],f[i-1][j-kv[i]]+kw[i]);
注意一下,01揹包是f[i][j]=max(f[i-1][j], f[i-1][j-v[i]]+w[i]);max中第一項是f[i-1][j],而這裡確是f[i][j],為什麼呢?想一下,當k=0時(也就是k剛開始遍歷),f[i][j]是0,max右項就是f[i-1][j]。被包含進來了,而且k的遍歷中,每次還要對f[i][j]進行更新,所以這裡是f[i][j]而不是f[i-1][j]。
**:
memset
(f,0
,sizeof
(f))
;for
(int i=
1; i<=n; i++)}
}
優化:
將原始演算法的dp思想轉變一下。
設f[i][j]表示出在前i種物品中選取若干件物品放入容量為j的揹包所得的最大重量。那麼對於第i種物品的出現,我們對第i種物品放不放入揹包進行決策。
如果不放那麼f[i][j]=f[i-1][j];如果確定放,揹包中應該出現至少一件第i種物品,所以f[i][j]中至少應該出現一件第i種物品,即f[i][j]=f[i][j-v[i]]+w[i]。
為什麼會是f[i][j-v[i]]+w[i]?因為我們前面已經最大限度的放了第i件物品,如果能放就放這最後的一件,(或者理解為前面已經往揹包中放入了第i件物品,我們每一次只增加一件的往揹包裡放,而且只能增加一件,多了放不下)。
**:
memset
(f,0
,sizeof
(f))
;for
(int i=
1; i<=n; i++
)}
附滾動陣列優化:
for
(int i=
1; i<=n; i++
)}
動態規劃 揹包問題 完全揹包
有n種物品和乙個容量為v的揹包,每種物品都有無限件可用。第i種物品的費用是w i 價值是v i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。貪心 y or n 因為每件物品都可以選取任意件,你也許會想到貪心演算法 選取價值最高的就好了 看上去沒什麼毛病,但是有乙個問題...
動態規劃揹包問題 完全揹包
問題背景描述 你有乙個容量為v的揹包,現在有n種物品供你選擇,每件物品可以選擇無數次,每種物品所佔的空間為c i 價值為v i 現在讓你作出最佳方案,使揹包中的總價值最大。有了之前01揹包的基礎,我們很快就能寫出完全揹包的狀態轉移方程 f i j max 但是這樣的時間複雜度就很大了o v v c ...
動態規劃 揹包問題(01揹包 完全揹包)
揹包問題 多種物品 重量不同 價值不同 你可以取最多重量不超過w的物品,問最大價值為多少?01揹包 指的是 有n個物品 每個物品的重量為w i 價值為v i 每個物品只有乙個 所有面臨這些物品只有兩種結果 1 拿這件物品,揹包容量減去w i 此時的價值增加v i 2 不拿這件物品,揹包容量不變,最大...