题目对应链接:登录—专业IT笔试面试备考平台_牛客网
一、分析题目
这里虽然很容易想到贪⼼,但是很不幸,贪⼼是错的。
正确的解法应该是枚举所有的情况(遇到这种一元二次方程,并给出其中一个值的取值范围和另一个值与之的关系,这种类型的题目就可以用枚举来做)。
二、代码
//值得学习的代码 #include <iostream> using namespace std; long long n, m, a, b; int main() { cin >> n >> m >> a >> b; long long ret = 0; for(long long x = 0; x <= min(n / 2, m); x++) // 枚举 1 号礼包的个数 { long long y = min(n - x * 2, (m - x) / 2); // 计算 2 号礼包的个数 ret = max(ret, a * x + b * y); } cout << ret << endl; return 0; }
三、反思与改进
这道题目的第一想法就是贪心,想着通过比较 a 和 b 的大小来判断先一直选哪一个,没有想到这题贪心是错的。其实举一个简单的反例即可(n=2,m=100,a=3,b=2)这种情况下,贪心就没法正确得出结果了。