完全揹包問題
狀態轉移方程
物品拆分
一維狀態
1、完全揹包問題
有乙個容量為v的揹包和n種物品,第i種物品的體積是c[i],價值是w[i]。每種物品都有無限件可用,求將哪些物品裝入揹包使得價值總和最大。
2、狀態轉移方程
對於第i件物品,01揹包的關鍵在於取或不取,而完全揹包就有取0件、1件、…k件(k<=v/c[i])的選擇,因此狀態方程為:
dp[i][j] = max(dp[i-1][j-k*c[i]] + k*w[i]), 0<=k<=j/c[i]
3、物品拆分
把第i件物品拆分成多個物品,體積為c[i]2^k,價值為w[i]2^k,其中k滿足c[i]*2^k<=v,這樣,完全揹包問題就轉化成了01揹包問題,即每個物品只能選或者不選。
這樣拆分的依據:對於第i件物品,不管選擇幾件,都可以用若干個2^k的和。例如:
0 = 都不選
1 = 2^0
2 = 2^1
3 = 2^1 + 2^0
4、一維狀態
類似01揹包的一維狀態,區別在於內層迴圈(容量)為正向c[i]..v。
for 1..n
for c[i] .. v
dp[j]=max(dp[j], dp[j-c[i]]+w[i])
5、裝滿問題
如果題目要求「恰好裝滿」,和01揹包一樣,只需要把除dp[0][0]外的其它dp[0][j]都初始化為-inf即可。
在某個狀態計算時,假如裝不滿的結果是-inf,當計算max時,就會被淘汰出去。
完全揹包問題(3)
有n種物品,揹包容積為m。每種物品都有對應的體積和價值,分別為w和d。每個物品可以取多次,其他參見01揹包問題,01揹包問題每種物品至多可以取1次,其他和完全揹包問題一樣。通俗來講,假設小黑去超市購物,購物車大小一定,每個商品的價值和大小都不一樣,問怎樣裝購物車裝滿的情況下物品總價值最大。01揹包問...
01揹包,完全揹包
動態規劃 動態規劃的核心是狀態以及狀態轉移方程。需要定義乙個 i,j 狀態以及該狀態的指標函式d i,j 01揹包 有n種物品,每種只有乙個,第i件物品的體積為vi質量為wi。選一些物品裝到體積為c的揹包中,使其體積不超過c的前提下重量最大。namevw abcd e 子問題定義 dp i j 表示...
(揹包二)完全揹包
public class beibaocomplete int weight int capacity 8 int value int weight int capacity 12 int result packagecomplete value,weight,capacity system.out...