多重揹包問題 II

2021-09-08 03:36:17 字數 1569 閱讀 9540

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

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

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

輸出最大價值。

輸入格式

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

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

輸出格式

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

資料範圍

0

1000

001000

0

2000

002000

0

,wi,

si

≤2000

00​,wi

​,si

​≤20

00輸入樣例

4 5

1 2 3

2 4 1

3 4 3

4 5 2

輸出樣例:

10
n範圍在103

10^3

103時不能用n

3n^3

n3的做法需要用到多重揹包的二進位制優化方法。

如果乙個物品有s個,則分成s份,變成01揹包問題

不能直接拆,會擴大資料規模。可以用二進位制拆法

乙個有s件的物品,要把它分成s個選和不選,可以把它分成log(s)(1,2,4,8…….)份。這樣可以將資料規模的擴大降到最低。

比如19件,分成1,2,4,8,4(補)份

則取1件可以選出來

取2件可以選出來

…選19件可以選出來

可以證明這樣分可以涵蓋所有情況。

#include

#include

#include

#include

using namespace std;

const

int n =

2010

;int n, m;

//n個物品,揹包容量為m

int f[n]

;int

main()

if(s >

0) goods.

push_back

(make_pair<

int,

int>

(v * s, w * s));

}for

(auto good : goods)

for(

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

) f[j]

=max

(f[j]

, f[j - good.first]

+ good.second)

;

cout << f[m]

<< endl;

return0;

}

多重揹包問題II

多重揹包問題ii 總體積是m,每個小物品的體積是a i 每個小物品的數量是b i 每個小物品的價值是c i 求能夠放入揹包內的最大物品能夠獲得的最大價值 和上乙個很類似 上一題體積就是價值,這裡的價值是單獨定義了 狀態轉移方程 不放a i f i j f i 1 j 放a j 可放多個設為k,k m...

多重揹包問題 II

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

多重揹包問題 II

原題鏈結acwing5 基本思考框架 思路和多重揹包問題i一樣,但這題的資料範圍變成1000了,非優化寫法時間複雜度o n 3 接近 1e9必超時。優化多重揹包的優化 首先,我們不能用完全揹包的優化思路來優化這個問題,因為每組的物品的個數都不一樣,是不能像之前一樣推導不優化遞推關係的。詳情看下面引用...