一、游游的水果大礼包
题目解析
现在有 n 个苹果、m 个桃子,我们可以将 2 个苹果和 1 个桃子组成一号大礼包;1 个苹果和 2 个桃子组成二号大礼包。一号大礼包的价值为 a、二号大礼包的价值为 b。要求组合出来的礼包的最大价值。
算法思路
本道题的正确解法是枚举。
题目给了 n 个苹果,m 个桃子。我们可以枚举所有可能的情况(组合一号礼包的数量从 0 到最大可能值),这样一号礼包的个数区间为 [0, x]。
这个 x 如何求?我们需要同时考虑苹果数量 n 和桃子数量 m。max 应该等于苹果能组成一号礼包的数量 n/2 和桃子能够组成一号礼包的数量 m 的最小值,即 x = min(n/2, m)。
另外需要注意数据范围,题目中给定 n, m, a, b 的范围是 [1, 1000000],最终结果使用 int 可能会溢出,要使用 long long 类型。
在遍历过程中,更新结果即可。公式为 count1 * a + count2 * b。
这里如果想要使用贪心算法进行优化是行不通的,题目条件较少,不建议使用贪心。
代码实现
#include <iostream>
using namespace std;
int main() {
int n, m, a, b;
cin >> n >> m >> a >> b;
int t = min(n / 2, m);
long long ret = 0;
for (int x = 0; x <= t; x++) {
long long y = min(n - 2 * x, (m - x) / 2);
ret = max(ret, x * a + y * b);
}
cout << ret << endl;
return ;
}


