模板 多重揹包問題

2021-10-02 08:49:38 字數 2163 閱讀 5810

有 n 種物品和乙個容量是 v 的揹包。

第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。

求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。

輸出最大價值。

輸入格式

第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。

接下來有 n 行,每行三個整數 vi,wi,si,用空格隔開,分別表示第 i 種物品的體積、價值和數量。

輸出格式

輸出乙個整數,表示最大價值。

資料範圍

00輸入樣例45

1232

4134

3452

輸出樣例:

10

思路與其他揹包問題基本一樣,沒什麼區別,只不過加了一層for迴圈判斷

參考blog:

01揹包

完全揹包問題

s陣列表示最多能裝多少次,c表示裝多少次

c++ code:

#include

using

namespace std;

int f[

110]

[110];

int v[

110]

,w[110

],s[

110]

;int

main()

有 n 種物品和乙個容量是 v 的揹包。

第 i 種物品最多有 si 件,每件體積是 vi,價值是 wi。

求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。

輸出最大價值。

輸入格式

第一行兩個整數,n,v,用空格隔開,分別表示物品種數和揹包容積。

接下來有 n 行,每行三個整數 vi,wi,si,用空格隔開,分別表示第 i 種物品的體積、價值和數量。

輸出格式

輸出乙個整數,表示最大價值。

資料範圍

000本題考查多重揹包的二進位制優化方法。

輸入樣例45

1232

4134

3452

輸出樣例:

10

演算法: 揹包+二進位制優化

你們可以看到,這兩題唯一的區別就是資料大了不少

所以我們怎麼辦呢?

很容易想到,可以把s個物品拆成乙個個物品,變為01揹包,可是此時的時間複雜度為o(10^9)還是會超時

那末我們就把它拆成盡量少的物品

例如:

7   拆成 124

為什麼呢?應為1,2

,4可以用加法算出1

~7中所有的數1=

12=2

3=1+

24=4

5=1+

46=2

+47=

1+2+

4可以注意到:1=

2^02

=2^1

4=2^

2所以這題就簡單了,只有把每個物品按如上方式拆分就可以了

注意:這題要用到vector

其餘不懂的看注釋

c++ code:

#include

#include

using

namespace std;

const

int n=

2010

;int n,m;

int f[n]

;struct good

;int

main()

);}//拆分

if(s>

0) goods.

push_back()

;//如有剩餘,將其放入vector陣列中

}for

(auto good: goods)

//auto 是一種隨時改變的定義方式

for(

int j=m;j>=good.v;j--

) f[j]

=max

(f[j]

,f[j-good.v]

+good.w)

;//01揹包

cout<;//輸出最終解

return0;

}

DP 多重揹包問題模板

小明手裡有n元錢全部用來買書,書的 為10元,20元,50元,100元。問小明有多少種買書方案?每種書可購買多本 輸入格式 乙個整數 n,代表總共錢數。輸出格式 乙個整數,代表選擇方案種數。資料範圍 0 n 10000 n 1000 輸入樣例1 20輸出樣例1 2輸入樣例2 15輸出樣例2 0輸入樣...

多重揹包模板

有n種物品和乙個容量為v的揹包。第i種物品最多有num i 件可用,每件費用是c i 價值是w i 求解將哪些物品裝入揹包可使這些物品的費用總和不超過揹包容量,且價值總和最大。多重揹包問題的思路跟完全揹包的思路非常類似,只是k的取值是有限制的,因為每件物品的數量是有限制的,狀態轉移方程為 dp i ...

多重揹包模板

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