多重揹包及二進位制優化

2021-10-02 04:19:19 字數 1037 閱讀 9162

///  n = 物品種類; s[i] = 當前種類物品的個數;

/// v = 容量;f[ ] = 總**;

for(int i=0;i分割線-------------------------------

技巧:轉化為0/1揹包問題

把第i種物品換成n[i]件01揹包中的物品,則得到了物品數為∑n[i]的01揹包問題,直接求解,複雜度仍然是o(v*∑n[i])。

但是我們期望將它轉化為01揹包問題之後能夠像完全揹包一樣降低複雜度。仍然考慮二進位制的思想,我們考慮把第i種物品換成若干件物品,使得原問題中第i種物品可取的每種策略——取0…n[i]件——均能等價於取若干件代換以後的物品。另外,取超過n[i]件的策略必不能出現。

方法是:將第i種物品分成若干件物品,其中每件物品有乙個係數,這件物品的費用和價值均是原來的費用和價值乘以這個係數。使這些係數分別為 1,2,4,…,2(k-1),s[i]-2k+1,且k是滿足s[i]-2^k+1>0的最大整數(注意:這些係數已經可以組合出1~s[i]內的所有數字)。例如,如果s[i]為13,就將這種物品分成係數分別為1,2,4,6的四件物品。

分成的這幾件物品的係數和為s[i],表明不可能取多於s[i]件的第i種物品。另外這種方法也能保證對於0…s[i]間的每乙個整數,均可以用若干個係數的和表示,這個證明可以分0…2k-1和2k…n[i]兩段來分別討論得出,並不難,希望你自己思考嘗試一下。

這樣就將第i種物品分成了o(logs[i])種物品,將原問題轉化為了複雜度為o(v*∑logs[i])的01揹包問題,是很大的改進。

優化方式舉例:17–>1,2,4,8,2 這裡的餘量為2

/// n = 物品種類; s[i] = 當前種類物品的個數;

/// v = 容量;f[ ] = 總**;

int total = 0;

for(int i=0;i0) ///二進位制轉化後存在的餘量

}for(int i=0;i=v[i];t--)

}printf("%d",f[v]);

多重揹包二進位制優化

多重揹包二進位制優化 將價值數量相同的物品分成1,2,4,8.因為100以內任何數都可以由幾個2的n次方數組成。所以,有遍歷沒乙個數變為遍歷每乙個2的n次方數。例題 有n種物品,每種物品的數量為c1,c2.cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2.wn wi為整數 與之相...

多重揹包(二進位制優化)

馬上就要輕院校賽了,沒時間了,下面是網上找的多重揹包,感覺很好 void zeroonepack int cost,int weight,int n void completepack int cost,int weight,int n void multipack int c,int w,int ...

多重揹包二進位制優化

時間長不寫 感覺變菜了。整體優化思路和快速冪很相近 如果第i個物品有num i 個,花費是 c i 價值是 v i 那麼我們可以把它拆分成數個物品。比如某個物品數量是14 花費是cost 價值是value 1 2 4 7 就可以把14個相同物品看成 4 個不同的物品,物品 數量花費 價值第乙個 11...