又发现新东西了哇咔咔
话说每天都能学到新的是不是因为我太弱了(什么都没见过%>_<%)
传说中的01分数规划问题的裸题。
从n组数中干掉k组数使最后的比例最大,于是二分答案排序一下再判定就好了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
double a[1005],b[1005],d[1005];
int n,k;
bool check(double l){
for(int i=1;i<=n;i++)
d[i]=a[i]-b[i]*l;
sort(d+1,d+1+n);
double x=0;
for(int i=k+1;i<=n;i++)
x+=d[i];
return x>0;
}
int main(){
while(scanf("%d%d",&n,&k)&&n){
for(int i=1;i<=n;i++)
scanf("%lf",&a[i]);
for(int i=1;i<=n;i++)
scanf("%lf",&b[i]);
double l=0.0,r=1.0,mid;
while(r-l>(1e-7)){
mid=(l+r)*1.0/2;
if(check(mid))l=mid;
else r=mid;
}
printf("%.0f\n",mid*100);
}
return 0;
}