多重揹包2 二進位制位優化

2021-10-06 10:15:49 字數 1422 閱讀 9109

資料範圍加強一下

0

00(n3)

o(n^3)

o(n3

)的演算法不行,需要優化成o(n

∗log

s∗v)

o(n*logs *v)

o(n∗lo

gs∗v

)思想多重揹包拆成01揹包,並且使用二進位制優化。

多重揹包是每個物品可以選s

is_i

si​次,把多重揹包問題拆成σsi

\sigma

σsi​

個01揹包問題,拆成σsi

\sigma

σsi​

個實際上複雜度並沒有優化。在拆的時候有技巧,不能拆成很多1的組合,我們想最少拆成多少份,拆成num

=⌈lo

g2σs

i⌉

num=\lceil log_2\sigma \rceil

num=⌈l

og2​

σsi​

⌉份(上取整)。

比如 第i件物品有13件,拆成⌈lo

g213⌉

=4

\lceil log_213\rceil=4

⌈log2​

13⌉=

4份,分別是1,2,4,6

其中6的**是13-(1+2+4)=6,即盡可能拆分成2的倍數,其餘為作差取得

對於拆出來的num個01揹包問題,其中物品體積和價值需要乘以拆出來的係數。

這裡的拆分我們使用vector進行維護,拆好乙個加入動態陣列乙個。

多重揹包拆分成為01揹包的**

for

(int i=

0;i;//物品的體積和價值相應的擴大k倍}if

(s>0)

);}}

ac**

#include

#include

#include

#include

using

namespace std;

const

int maxn=

2010

;int n,m,v,w,s;

int f[maxn]

;struct goods

;int

main()

);}if

(s>0)

);}}

memset

(f,0

,sizeof

(f))

;for

(int i=

0;isize()

;i++)}

cout<

clear()

;return0;

}

多重揹包二進位制優化

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