游游的水果大礼包
思路:
假设苹果有n个,桃有m个
然后有1号和2号两个人
1号取价值为a元的礼包x个,2号取价值为b元的礼包y个,那么最多可以组成 ax + by的价值总和,由于x个礼包一次消耗两个苹果,一个桃,y个礼包一次消耗一个苹果两个桃。
故易知x的范围为[ 0, min(n/2, m) ],y 的范围为 min[n - 2x,(m-x)/2],则我们就可以通过枚举来算出该结果。
同理我们可以把上面的枚举归类为一种题型,当要求ax + by时,已知x的范围,以及 y = f(x),那么可以用一层for循环n次,来枚举到。
#include <iostream> #include <string> #include <cstring> #include <vector> #include <algorithm> using namespace std; typedef long long ll; int main() { ll n, m, a, b, res = 0; cin >> n >> m >> a >> b; //枚举 for (int x = 0; x <= min(n / 2, m); x++) //枚举一号礼包的个数 { int y = min(n - x * 2, (m - x) / 2); //枚举二号礼包的数量 res = max(res, a * x + b * y); } cout << res << endl; return 0; }
}