多重揹包二進位制分組優化

2021-08-10 04:23:48 字數 1306 閱讀 6893

tty 的求助 2

【問題描述】

「唐詩」的好朋友**特別喜歡購物,一天,她拉著土豪 tty 去購物。她選中 了 n 種商品,第 i 種商品有庫存 ai,購買一件商品 i,tty 會獲得「唐詩」的好朋 友的好感度 bi,第 i 件商品的質量為 wi。 由於 tty 是土豪,所以他不用考慮錢不夠的問題。但是 tty 的力氣不大,所 以他只能提起質量不大於 m 千克的商品。tty 想知道他最多能獲得多少好感度。 對於 oi 大神 tty 來說,這樣的題目顯然很簡單,但是他身邊沒有電腦,所 以他只能再次向同為大神的你求助。

【輸入格式】

在輸入檔案 help.in 中,共有 n+1 行。 第一行為兩個數 n,m。 後接 n 行,每行 3 個數,第 i 行為 ai,bi,wi。

【輸出格式】

在輸出檔案 help.out 中,有乙個數,為 tty 最多獲得的好感度。

【樣例輸入】

3 10

2 3 4

1 4 3

2 5 3

【樣例輸出】

14【資料規模與約定】

測試點 資料規模 1~2 n≤5,m≤100,ai≤5 3~5 n≤100,m≤1000,ai≤100 6~10 n≤100,m≤20000,ai≤5000 對於 100%的資料保證 bi 在 int 範圍內,wi≤100

這道題顯然是一道多重揹包,考慮到資料範圍,我們應該對o(anm)的複雜度進行優化。

因為有多個相同的物品,我們可以發現, a個相同的物品可以當成1+2+...+2^k+x,共k+1種不同的物品,其中x小於2^(k+1), 這樣可以把 a 次重複計算化簡為 loga 次。

然後再用dp求解就行了。

#include#include#include#includeusing namespace std;

const int maxn = 100000;

const int maxm = 20000;

typedef long long ll;

typedef double db;

inline int get()

int n,m;

int b[maxn + 10],w[maxn +10],a,tot;

int f[maxm + 10];

int main()

else

nown *= 2;

} }memset(f,0,sizeof(f));

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

} printf("%d",f[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 ...

多重揹包二進位制優化

時間長不寫 感覺變菜了。整體優化思路和快速冪很相近 如果第i個物品有num i 個,花費是 c i 價值是 v i 那麼我們可以把它拆分成數個物品。比如某個物品數量是14 花費是cost 價值是value 1 2 4 7 就可以把14個相同物品看成 4 個不同的物品,物品 數量花費 價值第乙個 11...