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

2021-10-02 17:39:04 字數 1145 閱讀 2459

本題作為多重揹包二進位制優化模板

思路:乙個數是能用二進位制表達出來的,多重揹包有數量限制且按照常規三個for容易超時,因為第三個迴圈對數量的處理是逐個進行的,比如有10個,那就要執行10次.

因此通常我們把數量拆分,比如說10可以分裝成(1+2+4)+3,那4是怎麼來的,這個4是二進位制的結束點,10-(1+2)>2²,所以繼續進行,10-(1+2+4)<2³ ,即停止,此時餘數為3,。二進位制有個結論就是(2⁰+2¹+2²+…2ⁿ )的和∑最接近且小於x時,0~∑之間所有數都能被這個2的次冪組合出來.

比如10裡面的1可以由1得到,2由2得到,3由1+2得到,4由4得到,5由1+4得到,只需要加上x-∑(餘數),那麼0~10全部數字都可以表示出來,這樣我們相當於把幾個物品合成乙個,對應的價值和質量也就翻了幾倍,就像煉鐵一樣。

這一題可以看成給你乙個數y,

你要用小於y的數x1,x2,x3,…xn加起來等於y,y可以看成揹包問題中的容量同時也是價值的上限,xn可看成體積與價值都等於xn的物品,然後判斷最大值是否為價值上限y,是即填滿了揹包。

這裡時間複雜度變成了o(n*logm);

比如10≈2³,即可拆分成1,2,4三個產品,執行了三次迴圈

#include

#include

#define max(a,b) a>b?a:b

int value[

200005

],dp[

200005];

intmain()

else

t++; value[t]

=e*i;

}value[0]

=0;for

(i=0

;i<=t;i++

)else

if(i==

0&&j!=0)

else}}

if(dp[x]

==x)

else

printf

("\n");

}scanf

("%d %d %d %d %d %d"

,&a[1]

,&a[2]

,&a[3]

,&a[4]

,&a[5]

,&a[6]

);}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...