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

2024-07-03 11:03:50 浏览数 (2)

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

题解

题目解析

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

算法原理

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

代码编写

代码语言:javascript复制
#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元。因此,贪心算法是不可行的。

枚举的题型总结

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

0 人点赞