51nod 多重揹包問題(二進位制優化)

2021-08-24 23:13:42 字數 922 閱讀 8155

有n種物品,每種物品的數量為c1,c2......cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2......wn(wi為整數),與之相對應的價值為p1,p2......pn(pi為整數)。求揹包能夠容納的最大價值。

我們可以轉化成01揹包來做,但是這樣很慢。

所以我們可以二進位制優化。

乙個數a,我們可以按照二進位制來分解為1 + 2 + 4 + 8 …… +2^n + 剩下的數 = a

剩下的數等於a - (1 + 2 + 4 + 8 …… +2^n )

我們把a拆成這麼多項,可以證明,這麼多項可以組合出1~a的每乙個數

所以我們就可以把數量拆分,分成一些物品。這樣會快很多。

#include#include#define rep(i, a, b) for(int i = (a); i < (b); i++)

using namespace std;

const int maxn = 112;

const int maxm = 51234;

int f[maxm], v[maxn * 10], w[maxn * 10];

int n, m, n;

void add(int ww, int vv, int cc) //拆分

else cc -= now;

w[n] = ww * now;

v[n++] = vv * now;

now <<= 1;

} }int main()

rep(i, 0, n)

for(int j = m; j >= w[i]; j--)

f[j] = max(f[j], f[j - w[i]] + v[i]);

printf("%d\n", f[m]);

return 0;

}

51 Nod 1086 多重揹包問題(二進位制優化

1086 揹包問題 v2 基準時間限制 1 秒 空間限制 131072 kb 分值 40 難度 4級演算法題 收藏關注有n種物品,每種物品的數量為c1,c2.cn。從中任選若干件放在容量為w的揹包裡,每種物品的體積為w1,w2.wn wi為整數 與之相對應的價值為p1,p2.pn pi為整數 求揹包...

多重揹包二進位制優化

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