揹包問題 (二進位制優化模版)

2022-09-23 16:06:13 字數 920 閱讀 7756

51 nod

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

input

第1行,2個整數,n和w中間用空格隔開。n為物品的種類,w為揹包的容量。(1 <= n <= 100,1 <= w <= 50000)

第2 - n + 1行,每行3個整數,wi,pi和ci分別是物品體積、價值和數量。(1 <= wi, pi <= 10000, 1 <= ci <= 200)

output

輸出可以容納的最大價值。

input示例

3 62 2 5

3 3 8

1 4 1

output示例

9#include

#include

#include

#include

#include

#include

typedef long long ll;

using namespace std;

const int n=5e4+7;

int dp[n]=;

int v;

void com(int w,int p)//完全揹包

void zero(int w,int p)//01揹包

void add(int w,int p,int c)

int a=1;

while(c>a)//01揹包二進位制優化 將數字變為二進位制相加,打包

zero(w*c,p*c);

}int main()

{ int n;

int w,p,c;

scanf("%d%d",&n,&v);

for(int i=0;i

多重揹包二進位制優化

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