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) << '
';
}
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;
}