游游的水果大礼包(枚举)

题目链接:https://ac.nowcoder.com/acm/problem/255193

题解

题目解析

就拿第一个例子来看,当选择组成1个一号礼包和1个二号礼包时最大的价值是3元,而选择2个二号礼包时,最大的价值是4元,因此选择2个二号礼包。

算法原理

采用枚举的方法进行解题(这里使用贪心是不行的,在文末会解释为啥不行)。

代码编写

#include<iostream>
#include<algorithm>
using namespace std;
 
 
int main()
{
    long long  n = 0,m = 0,a = 0,b = 0;
    cin>>n>>m>>a>>b;
     
    long long ret = 0;
     
    for(long long x = 0;x<=min(n/2,m);++x)//枚举X的个数
    {
        long long y = min(n-2*x,(m-x)/2);//通过X来计算Y
         
        ret = max(ret,a*x+b*y);
    }
     
    std::cout<<ret<<std::endl;
     
     
    return 0;
}

贪心不可以的原因

这道题一开始会让人很容易就想到使用贪心,在苹果和桃子的数量允许的范围内,选择价值最大的那个礼包,最后再根据边界情况去选择一号礼包或者二号礼包,但是这里有个问题就是:

举个例子:n = 2 ,m = 100 ,a = 3,b = 2;

选择贪心算法去写,那么会选择1个一号礼包,此时的价值是3元,苹果的数量为0,结束。但是可以发现,如果选择2个二号礼包,最大的价值是4元。因此,贪心算法是不可行的。

枚举的题型总结

像本题,出现可以构成方程式,并且可以使用已有条件去解析方程式时,可以使用枚举,将其中的一个未知量枚举,使用该枚举出来的未知量进行计算另外一个未知量从而解出方程式,最终得到答案。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

山雾隐藏的黄昏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值