一天,欧姆诺诺姆来到了朋友家里,他发现了许多糖果。有蓝色和红色两种。他知道每颗红色糖果重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 3
Output示例
样例输出1 16
显然要尽量多吃单位欢乐值高的糖果,但可能吃不满c克而浪费,所以可以选择先吃几颗性价比低的,
但数量肯定不会过多,不会超过sqrt(c),暴力一下就好了
至于为什么不会超过sqrt(c),评论区有证明
#include<stdio.h>
#include<math.h>
#include<algorithm>
using namespace std;
#define LL long long
int main(void)
{LL i, c, p[2], v[2], ans = 0;scanf("%lld%lld%lld%lld%lld", &c, &p[1], &p[2], &v[1], &v[2]);for(i=0;i<=sqrt(c*1.0);i++){if(i*v[1]<=c)ans = max(ans ,i*p[1]+(c-i*v[1])/v[2]*p[2]);if(i*v[2]<=c)ans = max(ans ,i*p[2]+(c-i*v[2])/v[1]*p[1]);}printf("%lld\n", ans);return 0;
}