1548 欧姆诺姆和糖果 51NOD

一天,欧姆诺诺姆来到了朋友家里,他发现了许多糖果。有蓝色和红色两种。他知道每颗红色糖果重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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值