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