题目链接:http: //poj.org/problem?id=3111
题意:给出n个珠宝,每个珠宝都有价值和重量两个属性,求在其中选k个珠宝使得 总价值/总重量 的值最大。
打印出珠宝的id (不用按顺序)。
设置 一个值来衡量每一个珠宝的“性价比”,f=价值-ans*重量;ans为k个的 总价值/总重量 的值。
用迭代逼近,一直找到ans相差不超过某一个精度的值。
题意:给出n个珠宝,每个珠宝都有价值和重量两个属性,求在其中选k个珠宝使得 总价值/总重量 的值最大。
打印出珠宝的id (不用按顺序)。
设置 一个值来衡量每一个珠宝的“性价比”,f=价值-ans*重量;ans为k个的 总价值/总重量 的值。
用迭代逼近,一直找到ans相差不超过某一个精度的值。
代码如下:
//
#include<iostream>
#include<cstdio>
#include<math.h>
#include<algorithm>
#define eps 1e-3
using namespace std;
struct Node {
double v, w, f;
int id;
} node[100020];
int n, k;
bool cmp(const Node &a, const Node &b) {
return a.f > b.f;
}
int cmp2(const void *a, const void *b) {
Node *aa = (Node*) a;
Node *bb = (Node*) b;
if (aa->f > bb->f)
return -1;
else if (aa->f < bb->f)
return 1;
return 0;
}
int main() {
while (scanf("%d%d", &n, &k) != EOF) {
int i;
for (i = 0; i < n; i++) {
scanf("%lf%lf", &node[i].v, &node[i].w);
node[i].id = i + 1;
}
double res = 0, temp = 0.5;
double sumv, sumw;
while (fabs(temp - res) > eps) {
res = temp;
for (i = 0; i < n; i++)
node[i].f = node[i].v - res * node[i].w; //
sort(node, node + n, cmp);
// qsort(node,n,sizeof(node[0]),cmp2);
sumv = 0, sumw = 0;
for (i = 0; i < k; i++) {
sumv += node[i].v;
sumw += node[i].w;
}
temp = sumv / sumw;
}
for (i = 0; i < k; i++) {
if (i)
printf(" ");
printf("%d", node[i].id);
}
printf("\n");
}
return 0;
}