版权声明:未经过同意不得转载 https://blog.csdn.net/qq_42500298/article/details/83107194
当
一定的时候,
越大越好。f[i]s[i]表示前i个景点,当
=j时
的最大值,就和背包问题一样。
#include<bits/stdc++.h>
#define maxn 11111111
using namespace std;
long long n,m,i,j,p=1,q,d,a[maxn],b[maxn],f[maxn],s[maxn];
int main()
{
scanf("%lld%lld",&n,&m);
for(i=1;i<=n;i++)
{
scanf("%lld%lld",&a[i],&b[i]);
s[i]=s[i-1]+a[i];
}
for(j=0;j<=s[n];j++)
f[j]=-2147483647;
f[0]=0;
for(i=1;i<=n;i++)
for(j=min(s[i],110000ll);j>=a[i];j--)
f[j]=max(f[j],f[j-a[i]]+b[i]);
for(i=m;i<=s[n];i++)
if(f[i]*1.0/i>=q*1.0/p)
p=i,q=f[i];
d=__gcd(p,q);
p/=d;
q/=d;
if(p==1&&!q)
puts("-1");
else
printf("%lld/%lld",q,p);
return 0;
}
来源:zr