给定 N 个物品组成的集合,每个物品有两个属性,(a_i,b_i),求一组解 (x_i,1le i le n,x_i=0/1),使得 (frac{Sigma_{i=1}^nx_ia_i}{Sigma_{i=1}^nx_ib_i}) 取得最大值。
代码如下
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
const double eps=1e-6;
int n,m;
double a[maxn],b[maxn],c[maxn];
void read_and_parse(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)scanf("%lf",&a[i]);
for(int i=1;i<=n;i++)scanf("%lf",&b[i]);
}
bool right(double x){
for(int i=1;i<=n;i++)c[i]=a[i]-x*b[i];
sort(c+1,c+n+1);
double sum=0;
for(int i=n;i>n-m;i--)sum+=c[i];
return sum>=0;
}
void solve(){
double l=0,r=1;
while(r-l>eps){
double mid=(l+r)/2.0;
if(right(mid))l=mid;
else r=mid;
}
printf("%.4lf
",(l+r)/2.0);
}
int main(){
read_and_parse();
solve();
return 0;
}