思路:簡單地介紹一下二進位制優化:多重揹包,把總金額看作是揹包的容量。
假設數量是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...