题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1488
这题咋一看,背包题,但是数据太大背包放不下,所以只能暴力,但暴力也有技巧,纯暴力会TLE,所以分为两种情况
1.n<lcm(s1,s2)
这种情况纯暴力
2.n>lcm(s1,s2)
这种情况分成两部分算,一部分算n-n%lcm-lcm,一部分算lcm+n%lcm
代码如下:
#include <iostream>
#include <string.h>
#include <string>
#include <algorithm>
#include <stdio.h>
#include <math.h>
#include <stack>
#include <queue>
#include <sstream>
#include <vector>
#include <set>
using namespace std;
const int maxn=100005;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
long long n,s1,v1,s2,v2;
scanf("%lld%lld%lld%lld%lld",&n,&s1,&v1,&s2,&v2);
if(s1<s2)
{
swap(s1,s2);
swap(v1,v2);
}
long long g=__gcd(s1,s2);
long long lcm=s1*s2/g;
long long ans=0;
if(n<lcm)
{
int x=0;
while(x*s1<=n)
{
ans=max(ans,x*v1+(n-x*s1)/s2*v2);
x++;
}
}
else
{
long long k=n%lcm;
long long tmp=(n-k-lcm)/lcm*max(lcm/s1*v1,lcm/s2*v2);//尽量找性价比高的选
int x=0;
while(x*s1<=lcm+k)
{
ans=max(ans,tmp+x*v1+(lcm+k-x*s1)/s2*v2);
x++;
}
}
printf("%lld\n",ans);
}
return 0;
}