杭電2844題解(多重揹包二進位制優化)

2021-09-13 08:29:20 字數 952 閱讀 2383

題目大意:給出不同價值(整數)的硬幣和數量,給出乙個值(整數),在不超過這個值的情況下,硬幣能湊出多少個值(整數)。

題解:將硬幣的價值作為揹包容量和物品價值,多重揹包(揹包必須恰好裝滿),會超時,所以用二進位制優化。

二進位制優化:用2的0次方到2的n次方這幾個數(例如1,2,4)去組成1到2^(n+1)-1(1,2,3,4,5,6,7)之間的數

個人對二進位制優化的理解

例如:有8個相同價值的硬幣,先放乙個,再放二個,二個的與乙個的做比較,(有可能)產生放置了1個,兩個,三個硬幣的揹包,再放4個與之前的做比較,(有可能)產生放置了1個,2個,3個,4個,5個,6個,7個硬幣的揹包,最後剩的硬幣再放置計算一次,(有可能)產生放置了1個,2個,3個,4個,5個,6個,7個,8個硬幣的揹包

#include

#include

#include

#include

#include

#include

#include

using namespace std;

int dp[

100005];

int main()

for(int i=

0;i)for

(int i=

0;i) b[i]

-=k;

} int k=b[i];if

(k==0)

for(int j=m;j>=k*a[i]

;j--)}

int ans=0;

for(int i=

1;i<=m;i++)}

printf

("%d\n"

,ans);}

}``

多重揹包二進位制優化

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