揹包衍化 二維01揹包

2021-10-09 14:53:27 字數 1365 閱讀 6447

問題引入

有兩種物品**銷售,每種包裝裡兩種物品各有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個的最小花費,那麼狀態轉移方程為:

d [i

][j]

=min

(d[i

][j]

,d[i

−x][

j−y]

+t

)d[i][j]=min(d[i][j],d[i-x][j-y]+t)

d[i][j

]=mi

n(d[

i][j

],d[

i−x]

[j−y

]+t)

邊界處理

但是這裡需要注意的是,不難發現i−x

,j−y

i-x,j-y

i−x,j−

y需要大於等於0

00,按照習慣應該寫:

for

(int i =

0, x, y, t; i < s; i++

)

但是這樣是錯誤的,原因是如果這樣寫就變成了恰好拿n,m

n,mn,

m個物品,而本題對上界沒有要求,那麼也就是說當揹包容量溢位後,在狀態轉移時實際上變成了負值,那麼我們都從d[0

][0]

d[0][0]

d[0][0

]這個狀態轉移即可:

for

(int i =

0, x, y, t; i < s; i++

)

初始化

d [0

][0]

=0

d[0][0]=0

d[0][0

]=0,其餘均為inf

infin

f **

int s, n, m;

cin >> s >> n >> m;

memset

(d,0x3f

, sizeof d);d[

0][0

]=0;

for(

int i =

0, x, y, t; i < s; i++

)cout << d[n]

[m]<< endl;

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

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

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

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

揹包九講 之 01揹包及二維揹包

有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,每行兩個整數 ...