AcWing 5 多重揹包問題 II

2021-10-01 23:10:45 字數 2076 閱讀 2098

題目描述:

有 n 種物品和乙個容量是 v的揹包。第 i種物品最多有 si 件,每件體積是 vi,價值是 wi。

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

輸出最大價值。

輸入格式

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

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

輸出格式

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

資料範圍

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

輸入樣例

4 5

1 2 3

2 4 1

3 4 3

4 5 2

輸出樣例:

10
分析:

在acwing 4 多重揹包問題 i中我們介紹了多重揹包問題的常規解法,本題我們將使用二進位制優化來解決多重揹包問題。多重揹包問題的狀態轉移方程是f[i][j] = max,因為每個狀態都要去比較s個狀態的大小才能得出,所以複雜度為o(nms),在本題的資料範圍內最大運算次數是4*10^9級別的,顯然會tle。不使用單調佇列優化的話,我們也可以通過降低求解每個狀態需要的比較次數來降低時間複雜度。

回憶下01揹包問題,n個物品排成一排,每個物品要麼選要麼不選,選也只能選一次。多重揹包問題的不同之處在於第i個物品有s[i]個,試想下同樣排成一排,比如某件物品有s件,我們可以理解為第一件該物品選不選,第二件選不選......。這就完成轉化為了01揹包問題了,只要將同種物品看作不同的物品即可。但是直接這樣做時間複雜度並沒有優化。我們對多重揹包問題的狀態進行劃分,第i個物品可以選0,1,2,...,s[i]次,如果我們將這s個物品分成h組,合理的設定每組數量,就可以通過將s件物品的每個物品選與不選的問題轉化為h組物品每組物品的選與不選問題了。舉個例子,s = 3,我們原本需要考慮第一件選不選,第二件選不選,第三件選不選;現在將其分成兩組,第一組1件,第二組2件,00-兩組物品都不選,01-選第一組不選第二組,10-選第二組不選第一組,11-兩組都選,這四種情況分別對應了該間物品的四種選法,就像計算機組成原理裡面的片選線一樣。我們知道,乙個十進位制數都可以用二進位制數來表示,同樣我們可以對s進行二進位制分組,即第1組1個,第2組2個,...,第i組2^i個。這裡涉及到兩種分法,第一種:5 = 4 + 1;第二種:5 = 1 + 2 + 2。我們這裡選擇第二種分法,因為如果嚴格按照二進位制來分,我們需要先判斷不超過s的最大2^k是多少,然後每組的數量都要判斷下,即執行log運算,比如5,我們先log5取整得到2,第一組2^2件,第二組1件,而第二種分法類似於完全二叉樹,不需要做log運算,只要s大於1,第一組就分1件,然後看剩下的值大小,比如5分到第一組1件,還剩4,分到第二組2件,現在還剩2件,要小於4件,故剩下的單獨一組。1 + 2 + 4 + 8 + ... + 2^(k-1) = 2^k - 1,即前k - 1組可以表示出0到2^k - 1的數,再加上剩下的一組r件,可以表示出0到2^k - 1 + r中所有的數。舉個例子,乙個物品體積為1,價值為1,現在有5件,我們分三組,按照之前的分法,分別是1,2,2。現在我們將各組物品看作是新的物品,也就是第一件物品體積為1,價值為1;第二件體積為2,價值為2,;第三件體積為2,價值為2.這樣s個同種物品就轉化為了logs種不同物品了,接著呼叫01揹包的演算法即可解決。

複雜度分析:多重揹包問題的二進位制優化將物品的種類數n擴大到nlogs,揹包容量還是m,故時間複雜度為mnlogs = 2*10^6 * log2000 = 2.2 * 10 ^7,可以在一秒內完成運算。

#include #include using namespace std;

const int n = 11010,m = 2010;

int n,m,v[n],w[n],f[m];

int main()

if(s > 0)

}n = cnt;

for(int i = 1;i <= n;i++)

for(int j = m;j >= v[i];j--)

f[j] = max(f[j],f[j - v[i]] + w[i]);

cout

}

ACWing 5 多重揹包問題 II

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

acwing 5 多重揹包問題 II

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

多重揹包問題 II

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