假定一个答案,根据这个答案,计算
根据排序,此时我们并不是把最大的个相加跟0比较,而是把最大的个的
如果
结束循环,否则
继续循环。
逐渐逼近最优解的过程。
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
typedef double db;
const int N=1e5+5;
const db eps=1e-8;
db v[N],w[N];
struct node
{
db s;
int idx;
bool operator < (const node B) const{return s<B.s;}
}s[N];
int main()
{
int n,k;
db ans,tmp;
while(~scanf("%d%d",&n,&k))
{
for(int i=1;i<=n;i++) scanf("%lf%lf",&v[i],&w[i]);
ans=1e7;
tmp=0;
while(fabs(tmp-ans)>eps)
{
ans=tmp;
for(int i=1;i<=n;i++)
{
s[i].s=v[i]-ans*w[i];
s[i].idx=i;
}
sort(s+1,s+n+1);
db up=0,down=0;
for(int i=n;i>n-k;i--) up+=v[s[i].idx],down+=w[s[i].idx];
tmp=up/down;
}
for(int i=n;i>n-k;i--) printf("%d ",s[i].idx);
}
}