这个题目只需要遍历一下就行了,从轻的那一个从最大往小循环,找最值,只有这样才能保证最优。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
void solve(){
ll p, f, cnts, cntw, sw, ww;
cin >> p >> f >> cnts >> cntw >> sw >> ww;
if(sw > ww){
swap(sw, ww);
swap(cnts, cntw);
}
ll ans = 0;
for(int i = cnts; i >= 0; i --){ //从0个剑开始选直到选到cnts个,找最大值
int num = i; //num为刀的数量
ll tempcnts = cnts, tempcntw = cntw;
ll tempmax = 0, meca = p, foca = f;
if(meca >= num * sw){
tempmax += num;
meca -= num * sw;
num = 0;
}else if(meca >= sw){
tempmax += meca / sw;
num -= meca / sw;
meca -= meca / sw * sw;
}
//全部取完或者取完一部分
//1.如果取完,则判断剩余容量是否能放wax,并且还要判断sword是否已经被取完,没取完继续取,取完再判断是否能取wax
//2.如果只取一部分,则判断剩余容量是否能放wax;
int ts = cnts - i + num; //sword的剩余数量
if(foca >= sw){
int tt = foca / sw;
if(tt >= ts){
tempmax += ts;
foca -= ts * sw;
ts = 0;
}else{
tempmax += foca / sw;
ts -= tt;
foca -= tt * sw;
}
}
if(meca >= ww){
int tw = meca / ww;
if(tw >= tempcntw){
tempmax += tempcntw;
meca -= tempcntw * ww;
tempcntw = 0;
}else{
tempmax += meca / ww;
tempcntw -= meca / ww;
meca -= meca / ww * ww;
}
}
//if(i == 7)
// cout << "foca = " << foca << " tempcntw = " << tempcntw << endl;
if(foca >= ww){
int tw = foca / ww;
if(tw >= tempcntw){
tempmax += tempcntw;
tempcntw = 0;
}else{
tempmax += tw;
tempcntw -= tw;
}
}
//if(i == 7)
// cout << "i = " << i << " foca = " << foca << " tempmax = " << tempmax << endl;
ans = max(ans, tempmax);
}
cout << ans << endl;
}
int main(){
int t;
cin >> t;
while(t --){
solve();
}
return 0;
}