揹包問題3 二維揹包和分組揹包

2021-10-23 02:49:23 字數 1764 閱讀 8935

有總體積為v,且最大只能放質量為m

mm的揹包中,存在n個物品,體積為v

iv_i

vi​ ,價值為w

iw_i

wi​,質量為m

im_i

mi​,求怎麼放可以得到最大價值。

總體來說就是在01揹包的基礎上為物品新增了乙個重量的屬性,**還是比較簡單,可以在我們之前的01揹包的**基礎上加一層迴圈就ok了。並且我們至少需要乙個二維陣列dp[

i][j

]dp[i][j]

dp[i][

j]表示在揹包體積為i,質量為j的情況下的最大價值。狀態轉移方程為

d p[

i][j

]=ma

x(dp

[i][

j],d

p[i−

v[i]

][j−

m[i]

]+w[

i]

)dp[i][j]=max(dp[i][j],dp[i-v[i]][j-m[i]]+w[i])

dp[i][

j]=m

ax(d

p[i]

[j],

dp[i

−v[i

]][j

−m[i

]]+w

[i])

int n=

1010

;int dp[n]

[n];

inttwo_dimension_pack

(vector<

int>

& v,vector<

int>

& w,vector<

int>

& m,

int v)}}

return dp[v]

[m];

}

有總體積為v的揹包中,存在n組物品,每組物品最多只能選乙個,體積為vi,

jv_

vi,j

​ ,價值為wi,

jw_

wi,j​,i

ii組編號,j

jj是物品在組內的編號,s

ss是組內數量。求怎麼放可以得到最大價值。

在01揹包**的基礎上再加一層迴圈,判斷dp[

j]=m

ax(d

p[j]

,dp[

j−v[

0]]+

w[0]

,dp[

j−v[

1]]+

w[1]

...)

dp[j]=max(dp[j],dp[j-v[0]]+w[0],dp[j-v[1]]+w[1]...)

dp[j]=

max(

dp[j

],dp

[j−v

[0]]

+w[0

],dp

[j−v

[1]]

+w[1

]...

)多重揹包可以視為分組揹包的乙個特殊的情況,其每組內元素相同,所以他可以進行二進位制優化,單調佇列優化,但分組揹包只能老老實實的進行三層迴圈。

int n=

1010

;int dp[n]

;int

group_pack

(vector<

int>

& v,vector<

int>

& w,

int v)}}

return dp[v]

;}

01揹包 分組揹包(一維 二維 搜尋

上面的 中寫了01揹包 分組揹包的一維,二維陣列方法,還有搜尋法以及自己的一些思考。個人對於網上分組揹包的二維轉移方程覺得還不太完善 或者我自己理解的不太對 而且沒有找到很完全的 可能恰好沒找到 所以就自己寫了,有附題目位址,如果想看二維陣列分組揹包,直接拉到最後,前面都是廢話。不想看原位址的,下面...

0 1揹包,完全揹包,多重揹包, 二維費用揹包模板

0 1揹包,完全揹包,多重揹包,二維費用揹包模板 0 1揹包模板 每一件物品只有一件 void bag01 int cost,int weigth hdu 2159 fate 二維費用的揹包問題 有件物品,每一件物品具有兩種不同的費用,擁有這支付兩種的值為v1和v2 選擇一種物品時必須付出兩種代價 ...

揹包衍化 二維01揹包

問題引入 有兩種物品 銷售,每種包裝裡兩種物品各有x,y x,yx,y個,售價為t tt元,共有s ss個 銷售的包裝。現在需要兩種物品n,m n,mn,m個,問如何購買可以滿足需要並且花費最少的錢 狀態轉移 設d i j d i j d i j 表示第 一 二種物品分別買了i,j i,ji,j個的...