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