問題引入
有兩種物品**銷售,每種包裝裡兩種物品各有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 行,每行兩個整數 ...