题面见POJ2676
这就是一道0/1分数规划的模板题,其最经典的做法就是二分答案,然后check一下就可以了。
PS:注意double类型精度问题。
那么直接看代码吧:
#include<bits/stdc++.h>
#define maxn 1111
#define INF 0x7fffffff
#define eps 1e-15
#define pi acos(-1.0)
#define e 2.718281828459
#define mod (int)1e9 + 7;
using namespace std;
int n,k;
double a[maxn],b[maxn],y[maxn];
bool judge(double x)
{
for(int i=0;i<n;++i)
y[i]=a[i]-x*b[i];
sort(y,y+n,greater<double>());
double sum=0;
for(int i=0;i<n-k;++i)
sum+=y[i];
return sum>=0;
}
int main()
{
while(~scanf("%d%d",&n,&k),n+k)
{
for(int i=0;i<n;++i)
scanf("%lf",&a[i]);
for(int i=0;i<n;++i)
scanf("%lf",&b[i]);
double l=0,r=INF,m;
while(r-l>eps)
{
m=l+(r-l)/2;
if(judge(m))
l=m;
else
r=m;
}
printf("%.0lf\n",m*100);
}
return 0;
}