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

2021-10-08 17:07:13 字數 804 閱讀 2231

題意:有價值為1-6的六種玻璃球,現在告訴你各種玻璃球的個數,問能否將這些玻璃球分成兩份,使得兩份的總價值相等

既然要等分,那麼總價值必定是偶數,所以價值和為奇數是無法等分。

但價值和為偶數時,我們可以看做揹包問題,揹包的體積大小為sum/2,如果能夠等分,則恰好可以將這個揹包填滿,即有dp[sum/2]=sum/2.

每種玻璃球的數量1和無窮,所以這是乙個多重揹包,這道題得用到二進位制優化(別問我怎麼知道的,tle警告).二進位制優化就是把多重揹包轉化為01揹包,任意數都可以用多個二制數的和表示,所以將其拆分為若干個體積和價值為原來的2n的新物品,在進行01揹包,複雜度為nvlg(num).

#include

#include

#include

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace std;

const

int n =

2e5+50;

int dp[n]

, arr[10]

;int sum;

vector<

int> vec;

intinput()

if(arr[i]

>0)

}return sum;

}int

main()

else}if

(dp[sum /2]

== sum /2)

else}}

}

多重揹包二進位制優化

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