多重揹包二進位制優化

2021-09-25 21:33:42 字數 872 閱讀 6933

時間長不寫**,感覺變菜了。

整體優化思路和快速冪很相近

如果第i個物品有num[i]個,花費是 c[i] , 價值是 v[i] 

那麼我們可以把它拆分成數個物品。

比如某個物品數量是14 花費是cost 價值是value

1 2 4 7

就可以把14個相同物品看成 4 個不同的物品,

物品

數量花費

價值第乙個

11*cost

1*value

第二個2

2*cost

2*value

第三個4

4*cost

4*value

第四個7

7*cost

7*value

上述四個物品,任意組合就可以組成1-14之間所有可能的取值

所以只要對這四個物品跑0-1揹包得到的答案就是對的

我們可以看到,如果物品有1024個,拆分之後只有10個物品,這個優化還是很給力的。

# include # include # include using namespace std;

const int maxn = 1e5+10;

int c[maxn],v[maxn],num[maxn];

int dp[maxn];

int main()

for(int i = 1;i <= n;i++)

num[i] -= k;

k *= 2;}}

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

return 0;

}

多重揹包二進位制優化

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

二進位制優化多重揹包

優化多重揹包的方式中兩種常用的是單調佇列和二進位制優化,今天主要學習了一下二進位制優化 徵集各方資料 先說下 01 揹包,有n 種不同的物品,每個物品有兩個屬性 size 體積,value 價值,現在給乙個容量為 w 的揹包,問 最多可帶走多少價值的物品。int f w 1 f x 表示揹包容量為x...