类似http://blog.csdn.net/viphong/article/details/52635294
题意:裸的01分数规划,给定n个物品的价值v和重量w,只能选k个,求最优方案
二分得到最优方案,然后输出
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <algorithm>
#include <iostream>
#include <queue>
#include <map>
#include <vector>
using namespace std;
#define inf 2147483647
const int N = 1123456;
double aa[N],bb[N] ;
int n,m;
struct node
{
double x;
int id;
bool operator <(const node& b)const
{
return x>b.x;
}
};
node c[N];
double bin(double x)
{
for (int i=1; i<=n; i++)
c[i].x=aa[i]-x*bb[i],c[i].id=i;
sort(c+1,c+1+n);
double sum=0;
for (int i=1; i<=m; i++)
sum+=c[i].x;
return sum;
}
int main()
{
while(cin>>n>>m)
{
if (!n&&!m) break;
for (int i=1; i<=n; i++)
scanf("%lf%lf",&aa[i],&bb[i]);
double l=0,r=1e16;
while(r-l>1e-8)
{
double mid=(l+r)/2;
if (bin(mid)>0)
l=mid;
else r=mid;
}
bin(r);
for (int i=1; i<=m; i++)
{
if (i>1)printf(" ");
printf("%d",c[i].id);
}
printf("\n");
}
return 0;
}