多重揹包(二進位制拆分優化)

2021-10-05 03:01:04 字數 1036 閱讀 6885

多重揹包基本模型如下:

給定n種物品,其中第i種物品的體積為vi,價值為wi,並且有ci個。有一容積為m的揹包,要求選擇若干個物品放入揹包,使得物品總體積不超過m的前提下,物品價值總和最大。

輸入格式

第一行兩個整數,n,m,用空格隔開,分別表示物品種數和揹包容積。

接下來有 n 行,每行三個整數 vi,wi,ci,用空格隔開,分別表示第 i 種物品的體積、價值和數量。

輸出格式

輸出乙個整數,表示最大價值。

輸入樣例

4 51 2 3

2 4 1

3 4 3

4 5 2

輸出樣例:

10資料範圍

0二進位制拆分優化**:

#include

#include

#define max_m 100

#define max_n 100

using

namespace std;

int f[max_m+1]

;int n,m;

int v[max_n+1]

,w[max_n+1]

;int n1;

intmain()

v[++n1]

=z*x;

w[n1]

=z*y;

//把z以2的指數分堆,1、2、4 ... 2^(k-1),z-2^(k-1)

} f[0]

=0;for

(int i=

1;i<=n1;i++

)for

(int j=m;j>=v[i]

;j--

) f[j]

=max

(f[j]

,f[j-v[i]

]+w[i]);

printf

("%d "

,f[m]);

return0;

}/*4 51 2 3

2 4 1

3 4 3

4 5 2

*/

多重揹包二進位制優化

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