poj3111K Best迭代法

来源:互联网 发布:电子琴知乎 编辑:程序博客网 时间:2024/04/28 15:13
题目链接:http: //poj.org/problem?id=3111


题意:给出n个珠宝,每个珠宝都有价值和重量两个属性,求在其中选k个珠宝使得 总价值/总重量 的值最大。
打印出珠宝的id (不用按顺序)。


设置 一个值来衡量每一个珠宝的“性价比”,f=价值-ans*重量;ans为k个的 总价值/总重量 的值。
用迭代逼近,一直找到ans相差不超过某一个精度的值。

代码如下:


//#include<iostream>#include<cstdio>#include<math.h>#include<algorithm>#define eps 1e-3using 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;}