3 完全揹包

2021-09-25 19:37:36 字數 915 閱讀 2814

完全揹包問題

狀態轉移方程

物品拆分

一維狀態

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...