51 nod 1548 歐姆諾姆和糖果(揹包思維暴力寫)@
阿新 • • 發佈:2019-01-05
一天,歐姆諾諾姆來到了朋友家裡,他發現了許多糖果。有藍色和紅色兩種。他知道每顆紅色糖果重Wr克,每顆藍色糖果重Wb克。吃一顆藍色糖果會給他帶來Hb的歡樂值,吃一顆紅色糖果會給他帶來Hr的歡樂值。
歐姆諾姆最多隻能吃C克的糖果,而且每一顆糖果不能只吃一半。現在他想通過吃藍色和紅色的糖果來獲得最大的歡樂值。
樣例解釋:每一種糖果吃兩顆即可。
Input
單組測試資料。 輸入佔一行有四個整數C,Hr,Hb,Wr,Wb (1≤C,Hr,Hb,Wr,Wb≤10^9).Output
輸出最大可能獲得的歡樂值。Input示例
樣例輸入1 10 3 5 2 3Output示例
樣例輸出1 16
給出兩種物品的價值和重量,給出揹包大小(資料範圍<=10億),因為資料量大要避免超時,因為價值最大的情況一定是全部為價效比高的物品,或者大部分為價效比高
的物品,小部分為價效比低的情況(這種情況是處理:全為價效比高的物品填不滿揹包,但是加上一些價效比低的價值更大)這種情況數量肯定比較小,列舉一下sqrt(n)內的
數量
#include <iostream> #include <cstdio> #include <cstring> #include <climits> #include <vector> #include <queue> #include <map> #include <cmath> #include <set> #include <algorithm> using namespace std; typedef long long LL; const int N = 50100; int a[N]; int main() { LL c, h1, h2, w1, w2, ans=0; scanf("%lld %lld %lld %lld %lld", &c, &h1, &h2, &w1, &w2); for(int i=0;i<sqrt(c*1.0);i++) { if(i*w1<=c) ans=max(ans,i*h1+(c-i*w1)/w2*h2); if(i*w2<=c) ans=max(ans,i*h2+(c-i*w2)/w1*h1); } printf("%lld\n",ans); return 0; }