0/1分数规划
前言
我好颓啊。
简述
0/1 分数规划模型是指, 给定序列 \(\{a\}_n\) 、\(\{b\}_n\) , 求一序列 \(\{x\}_n\) , 满足 \(x_i \in \{0,1\}\) , 使得 \(\dfrac{\sum a_i x_i}{\sum b_i x_i}\) 最大。
这个问题具有单调性, 二分+贪心即可算出答案。
Dropping Test
simple problem, 不必写。
#include<bits/stdc++.h>
using namespace std;
const int N = 1003;
const double eps = 1e-8;
int n,k,a[N],b[N];
double c[N];
bool check(double L) {
for(int i=1;i<=n;++i)c[i]=(1.0*a[i]-L*b[i]);
sort(c+1,c+1+n);
double sum=0;
for(int i=k+1;i<=n;++i) sum+=c[i];
for(int i=1;i<=k;++i) if(c[i]>0)sum+=c[i];
return (sum>eps);
}
void sol()
{
double l=0, r=1;
for(int i=1;i<=100;++i)
{
double mid = (l+r) / 2;
if(check(mid)) l=mid;
else r=mid;
}
cout << (int)(100*l+0.5) << '\n';
}
int main()
{
while(scanf("%d%d",&n,&k)!=EOF && n) {
for(int i=1;i<=n;++i)scanf("%d",&a[i]);
for(int i=1;i<=n;++i)scanf("%d",&b[i]);
sol();
}
return 0;
}