利用枚举法来做,当S1或者S2比较大的时候直接选择这两者中最大的一个来进行枚举,否则按照S1个S2的体积与S2个S1的体积相等,然后比较对应两者的价值大小,按照价值小的来进行枚举就行了。具体实现见如下代码:
#include<iostream>
#include<vector>
#include<string>
#include<set>
#include<stack>
#include<queue>
#include<map>
#include<algorithm>
#include<cmath>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<cstdio>
#include<deque>
using namespace std;
typedef long long LL;
int main(){
LL T, S1, V1, S2, V2;
cin >> T;
LL maxn;
int Case = 1;
while (T--){
LL N;
cin >>N>> S1 >> V1 >> S2 >> V2;
if (S1 > S2){
swap(S1, S2); swap(V1,V2);
}
if (S2 > N / S2) maxn = N / S2;
else{
if (S1*V2 > S2*V1){
swap(S1,S2); swap(V1,V2);
}
maxn = S1 - 1;
}
LL result = 0;
for (int i = 0; i <= maxn; i++){
result = max(result,i*V2+((N-i*S2)/S1)*V1);
}
cout <<"Case #"<<Case++<<": "<< result << endl;
}
return 0;
}