動態規劃之揹包九講之四 混合揹包

2021-10-05 17:36:57 字數 996 閱讀 8748

題目:有 n 種物品和乙個容量是 v 的揹包。物品一共有三類:

第一類物品只能用1次(01揹包);

第二類物品可以用無限次(完全揹包);

第三類物品最多只能用 si 次(多重揹包);

每種體積是 vi,價值是 wi。

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

輸出最大價值。

輸入格式

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

si=−1 表示第 i 種物品只能用1次;

si=0 表示第 i 種物品可以用無限次;

si>0 表示第 i 種物品可以使用 si 次;

輸出格式

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

資料範圍

0解析:在讀入物品資料時進行分類,將三類揹包問題分成01揹包與完全揹包,其中只需要把多重揹包按二進位制優化思想分成01揹包即可。

code:

#include

#include

#include

using

namespace std;

const

int n =

1010

;int f[n]

;struct thing

;vector things;

intmain()

);else

if(s ==

0) things.

push_back()

;else);

}if(s >

0) things.

push_back()

;}}for

(auto thing : things)

}else}}

cout<;return0;

}

揹包九講 之 混合揹包思路題解

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

揹包九講專題 混合揹包

不優化樸素解法,01揹包看出s 1,完全揹包看成s inf,再跑多重揹包 時間複雜度高,3層for迴圈 includeusing namespace std const int maxn 1e3 5 int dp maxn intv maxn w maxn s maxn intmain for in...

揹包九講之 01揹包

01揹包是最基礎的揹包問題,其中01代表的就是第i個物品的選或不選,在此先設v i 為體積,w i 為價值。很顯然,我們可以使用二位陣列dp i j 來表示前i個物品在揹包容量為j的時候可存放的最大價值。首先dp 0 0 0是很顯然的。而計算dp i j 時,存在01兩種情況 選或不選第i件物品。1...