两种枚举, 当N / S1比较大的时候枚举S1个数, 反之枚举S2个数。
如果都不大, 那么S2个S1和S1个S2的体积一样, 如果S2 * V1 > S1 * V2, 则枚举S2的个数, S2最多能取到S1 - 1个, 否则就和S2个S1的体积一样大了。
反之枚举S1个数。
#include <cstdio>
#include <algorithm>
#include <iostream>
using namespace std;
const int lim = 100000;
int main() {
int T, Case = 0;
scanf("%d", &T);
while(T--) {
long long N, S1, V1, S2, V2, V = 0;
cin >> N >> S1 >> V1 >> S2 >> V2;
if(N / S1 < lim) {
for(int i = 0; i <= N / S1; i++)
V = max(V, i * V1 + (N - i * S1) / S2 * V2);
} else if(N / S2 < lim) {
for(int i = 0; i <= N / S2; i++)
V = max(V, i * V2 + (N - i * S2) / S1 * V1);
} else if(S2 * V1 > S1 * V2) {
for(int i = 0; i < S1; i++)
V = max(V, i * V2 + (N - i * S2) / S1 * V1);
} else {
for(int i = 0; i < S2; i++)
V = max(V, i * V1 + (N - i * S1) / S2 * V2);
}
cout << "Case #" << ++Case << ": " << V << endl;
}
return 0;
}