链接:点击打开链接
题意:有n个物品的价值v和重量w,从中选择k个使之单位重量价值最大,并输出选择的序列
代码:
#include <set>
#include <cstdio>
#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int INF=0x3f3f3f3f;
int n,k;
struct node{
double v,w,tmp;
int id;
};
bool cmp(node x,node y){
return x.tmp>y.tmp;
}
node s[100005];
bool judge(double d){
int i;
double sum;
sum=0;
for(i=0;i<n;i++)
s[i].tmp=s[i].v-d*s[i].w;
sort(s,s+n,cmp);
for(i=0;i<k;i++)
sum+=s[i].tmp;
return sum>=0;
} //01分数规划,详见poj2976
int main(){
int i,j;
double l,r,mid;
while(scanf("%d%d",&n,&k)!=EOF){
for(i=0;i<n;i++){
scanf("%lf%lf",&s[i].v,&s[i].w);
s[i].id=i+1;
}
l=0,r=1.0*INF;
for(i=0;i<100;i++){
mid=(l+r)/2;
if(judge(mid))
l=mid;
else
r=mid;
}
for(i=0;i<k;i++)
printf("%d ",s[i].id);
printf("\n");
}
return 0;
}