ACWing 7 混合揹包問題

2021-10-20 20:00:17 字數 2123 閱讀 7848

有n

nn種物品和乙個容量是v

vv的揹包。物品一共有三類:第一類物品只能用1

11次(0−1

0-10−

1揹包);第二類物品可以用無限次(完全揹包);第三類物品最多只能用s

is_i

si​次(多重揹包);每種體積是v

iv_i

vi​,價值是w

iw_i

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

輸入格式:

第一行兩個整數,n

nn,v

vv,用空格隔開,分別表示物品種數和揹包容積。接下來有n

nn行,每行三個整數vi,

wi,s

iv_i,w_i,s_i

vi​,wi

​,si

​,用空格隔開,分別表示第i

ii種物品的體積、價值和數量。si=

−1

s_i=−1

si​=−1

表示第i

ii種物品只能用1

11次;si=

0s_i=0

si​=

0表示第i

ii種物品可以用無限次;s

i>

0s_i>0

si​>

0表示第i

ii種物品可以使用s

is_i

si​次;

輸出格式:

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

資料範圍:

0

v≤

1000

00v≤10

000

,wi≤

1000

00​,wi

​≤10

00− 1≤

si

≤1000

−1≤si≤1000

−1≤si≤

1000

思路還是動態規劃,狀態表示是f[i

][j]

f[i][j]

f[i][j

],表示前i

ii個物品裡選並且體積不超過j

jj的最大價值,可以按照第i

ii個物品選還是不選分類。對於si=

−1

s_i=-1

si​=−1

,可以用0−1

0-10−

1揹包的方式遞推;對於si=

0s_i=0

si​=

0,可以用完全揹包的方式遞推;對於s

i>

0s_i>0

si​>

0,可以用多重揹包的方式遞推,但是這裡需要加上二進位制優化,以防超時。參考:

1、0 −1

0-10−

1揹包:

2、完全揹包:

3、多重揹包二進位制優化版:

**如下:

#include

using

namespace std;

const

int n =

1010

;int n, m;

int f[n]

;int

main()

if(s)

for(

int j = m; j >= s * v; j--

) f[j]

=max

(f[j]

, f[j - s * v]

+ s * w);}

}

cout << f[m]

<< endl;

return0;

}

時間複雜度o(v

((n−

k)+∑

i=1k

log⁡si

))

o(v((n-k)+\sum _^k\log s_i))

o(v((n

−k)+

∑i=1

k​logsi​

)),其中k

kk是可以使用s

is_i

si​次的物品種類數(即要二進位制優化的物品種類數),空間o(v

)o(v)

o(v)

AcWing 7 混合揹包問題

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

Acwing 混合揹包

有 n 種物品和乙個容量是 v 的揹包。物品一共有三類 第一類物品只能用1次 01揹包 第二類物品可以用無限次 完全揹包 第三類物品最多只能用 si 次 多重揹包 每種體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使物品體積總和不超過揹包容量,且價值總和最大。輸出最大價值。輸入格式 第一行兩...

混合揹包問題

如果將p01 p02 p03混合起來。也就是說,有的物品只可以取一次 01揹包 有的物品可以取無限次 完全揹包 有的物品可以取的次數有乙個上限 多重揹包 應該怎麼求解呢?考慮到在p01和p02中給出的偽 只有一處不同,故如果只有兩類物品 一類物品只能取一次,另一類物品可以取無限次,那麼只需在對每個物...