COJ 1086 超市購物 (揹包問題)

2022-03-06 19:42:36 字數 1437 閱讀 7173

上次去超市掃蕩回來的東西用完了,staginner又得跑超市一趟,出發前他列了一張購物清單,打算去買k種不同的商品,每種買一件。到了超市,staginner發現每種商品有n個品牌,每個品牌此商品的**為vi,對staginner的作用值為wi,他會從這n個品牌裡面挑乙個品牌買。這時,staginner突然想起出門時只帶了m元錢,又懶得去取錢了,所以不一定能買完k種商品,只好盡可能地讓買的東西對自己的總作用值ans最大。

多組樣例。

第一行兩個整數k,m代表staginner想買的不同種類商品的數目和他帶的錢 (0 < k <= 30, 0 < m <= 2000)

以下輸入分為k個部分,代表k種商品。

每個部分第一行為乙個數字n,代表第k種商品的n個品牌,n不大於10。之後跟著n行,每行兩個數字,代表物品的**vi和作用值wi。其中 0 < vi < m。

輸出case #: 最大總作用值,每兩個樣例之間有乙個空行。

3 100

350 600

20 700

30 800

230 500

40 600

160 200

2 500

2200 1000

260 1200

1280 300

case 1: 1400

case 2: 1300

分組揹包問題。

view code

#include #include 

#define k 30

#define n 10

#define m 2001

intk,m;

intcnt[k];

intw[k][n],v[k][n];

intd[m][k][n];

int dp(int money,int i,int

j)

if(i==0

)

if(j==0

)

if(money>=v[i][j] && dp(money-v[i][j],i-1,cnt[i-1]-1)+w[i][j]>dp(money,i,j-1

))

return d[money][i][j]=dp(money-v[i][j],i-1,cnt[i-1]-1)+w[i][j];

return d[money][i][j]=dp(money,i,j-1);}

intmain()

}memset(d,-1,sizeof

(d));

if(kase) puts(""

); printf(

"case %d: %d\n

",++kase,dp(m,k-1,cnt[k-1]-1

)); }

return0;

}

CSU 1086 超市購物 分組揹包問題

time limit 1 sec memory limit 128 mb submit 21 solved 10 submit status 上次去超市掃蕩回來的東西用完了,staginner又得跑超市一趟,出發前他列了一張購物清單,打算去買k種不同的商品,每種買一件。到了超市,staginner發...

動態規劃 01揹包 超市購物

這種比較特殊的01揹包 01揹包 01揹包 還是沒有做到過唉。這道題我們觀察資料,發現v iv i vi 的具體數字很小,但是揹包的花費卻很大,我們可以考慮用另外一張方式進行揹包 用價值作為狀態,用花費作為具體的dpdp dp值進行計算。求在體積限制為代價最大,等價於在相同的價值 積最小 即用最小的...

1086 揹包問題 V2(多重揹包)

有n種物品,每種物品的數量為c1,c2 cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2 wn wi為整數 與之相對應的價值為p1,p2 pn pi為整數 求揹包能夠容納的最大價值。輸入第1行,2個整數,n和w中間用空格隔開。n為物品的種類,w為揹包的容量。1 n 100,1 w...