多重揹包 二進位制優化 poj1276

2021-09-24 20:34:59 字數 805 閱讀 2467

思路:

多重揹包,把總金額看作是揹包的容量。

簡單地介紹一下二進位制優化:

假設數量是8,則可以把它看成是1,2,4,1的組合,即這4個數的組合包括了1-8的所有取值情況。這是為什麼呢?將它們轉換成二進位制再觀察一下:

1:12:10

4:100

1:1二進位制都只有0,1。所以1,2,4已經能夠組成1-7的所有情況,但是這樣還不夠 還要再加乙個1 才能湊成8

或許有人會問 為什麼不取到8,即1,2,4,8。注意!!所有的數加起來不可以超過數量。

我們主要是用到這些數的排列組合,取到8的話 上限就被我們擴大了,會取到原本不能取到的值。

將數量分解成之後,把number[i]*value當做乙個物品,就可以轉換成01揹包。

#include

#include

#include

using

namespace std;

int dp[

100010];

int w[

1000];

intmain()

if(sum > count)

}memset

(dp,0,

sizeof

(dp));

//別忘了初始化

for(

int i =

0; i < index; i++)}

cout << dp[cash]

<< endl;

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