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;
}
posted @ 2020-09-10 10:51  xwmwr  阅读(217)  评论(0编辑  收藏  举报