【模板】0-1 分数规划

给定 N 个物品组成的集合,每个物品有两个属性,\(a_i,b_i\),求一组解 \(x_i,1\le 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\n",(l+r)/2.0);
}

int main(){
	read_and_parse();
	solve();
	return 0;
}
posted @ 2018-12-03 15:24  shellpicker  阅读(204)  评论(0)    收藏  举报