1548 欧姆诺姆和糖果 51NOD

来源:互联网 发布:淘宝视频要求 编辑:程序博客网 时间:2024/05/29 03:36

一天,欧姆诺诺姆来到了朋友家里,他发现了许多糖果。有蓝色和红色两种。他知道每颗红色糖果重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

从高质量糖果或低质量糖果选0个开始枚举,那么为什么枚举到sqrt(c)个呢?
假如高质量糖果或低质量糖果质量其中之一大于sqrt(c),那么显然相应的数量肯定小于 sqrt(c)
如果两者质量都小于sqrt(c),那么两者质量最小公倍数T一定小于C,当低质量较小者(m1)数量(sum1)超过sqrt(c)时,那一定能将取质量高m2数量sum1/m2,因为质量相同情况下取m2更优,也就是说只要m1数量超过sqrt(c),那么一定能取若干数量m2来取代m1会更优。(自己瞎几把想的,希望有人有更好更严格的证明求教)。

#include<bits/stdc++.h>using namespace std;int main(){    long long c,hr,hb,wr,wb;    while(cin>>c>>hr>>hb>>wr>>wb)    {        long long ans=-1;        for(long long i=0;i*i<=c;i++)        {            if(i*wr<=c) ans=max(ans,i*hr+(c-i*wr)/wb*hb);            if(i*wb<=c) ans=max(ans,i*hb+(c-i*wb)/wr*hr);        }        cout<<ans<<endl;    }}
1 0