题目链接: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元。因此,贪心算法是不可行的。
枚举的题型总结
像本题,出现可以构成方程式,并且可以使用已有条件去解析方程式时,可以使用枚举,将其中的一个未知量枚举,使用该枚举出来的未知量进行计算另外一个未知量从而解出方程式,最终得到答案。