【模板】0-1 分数规划

给定 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;
}
原文地址:https://www.cnblogs.com/wzj-xhjbk/p/10058717.html