有總體積為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個的...