多重揹包二進位制優化的思考

2021-06-18 00:10:55 字數 573 閱讀 6489

其實說白了我們最樸素的多重揹包做法是將有數量限制的相同物品看成多個不同的0-1揹包。這樣的時間複雜度為o(v*σn(i)) v為空間容量,n(i)為每種揹包的數量限制。如果這樣會超時,我們就得考慮更優的拆分方法,由於拆成1太多了,我們考慮拆成二進位制數,對於13的數量,我們拆成1,2,4,6(有個6是為了湊數)。 19 我們拆成1,2,4,8,4(最後的4也是為了湊和為19)。經過這個樣的拆分我們可以組合出任意的小於等於n(i)的數目(二進位制啊,必然可以)。j極大程度縮減了等效為0-1揹包時候的數量。 大概可以使時間複雜度縮減為o(v*lg(σn(i));

給個經典題目 poj 1014 

也是進行6個物品的數量二進位制拆分,等效為0-1揹包。

#include#include#includeusing namespace std;

int dp[110056];

int v[500];

int w[500];

int main()

if(c>0)

}num--;

for(int i=1; i<=num; i++)}}

}cout<<"collection #"<

多重揹包二進位制優化

多重揹包二進位制優化 將價值數量相同的物品分成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...