AcWing 7 混合揹包問題

2021-10-02 11:50:18 字數 920 閱讀 9059

題目描述:

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

物品一共有三類:

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

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

輸出最大價值。

輸入格式

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

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

分析:本題是01揹包,完全揹包以及多重揹包的混合題,每讀入乙個物品的屬性,是什麼揹包就按照哪個揹包的狀態轉移方程去轉移狀態即可。即s = 0時,完全揹包:f[i][j] = max(f[i-1][j],f[i][j-v]+w);s = -1時,01揹包:f[i][j] = max(f[i-1][j],f[i-1][j-v]+w),s > 0時,多重揹包,f[i][j] = max(f[i-1][j-kv]+kw),j >= kv且k <= s。鑑於多重揹包的樸素版本比較耗時間,本題就採用多重揹包問題的二進位制優化,具體分析見acwing 5 多重揹包問題 ii,由於01揹包相當於s = 1的多重揹包問題,所以可以歸入多重揹包的求解。

下面簡單講解下二進位制優化多重揹包問題,第i個物品有s件,將其分為若干組,每組含該物品1,2,4,8,...r個,r表示剩餘的件數,比如s = 9,則可以劃分為1,2,4,2四組,然後相當於求解體積分別為v,2v,4v,2v的四個物品的01揹包問題。

#include #include using namespace std;

const int n = 1005;

int f[n];

int main()

else

if(s)}}

printf("%d\n",f[m]);

return 0;

}

ACWing 7 混合揹包問題

有n nn種物品和乙個容量是v vv的揹包。物品一共有三類 第一類物品只能用1 11次 0 1 0 10 1揹包 第二類物品可以用無限次 完全揹包 第三類物品最多只能用s is i si 次 多重揹包 每種體積是v iv i vi 價值是w iw i wi 求解將哪些物品裝入揹包,可使物品體積總和不...

Acwing 混合揹包

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

混合揹包問題

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