题目大意为:一共m元钱,有n种物品,每种物品重量为j,价值为f,性价比为s。可以整个买,也可以切割开来买。即可以使用0到f的任意价格购买相应磅的物品:使用0.3f,购买0.3j磅的物品。
很明显,这是一道贪心的算法题。每次我们只需要取性价比最高的物品即可。1、排序 2、取物
#include<algorithm> #include<string.h> #include<iostream> #include<stdio.h> #include<string.h> using namespace std; struct goods //表示可买物品的结构体 { double j; //该物品总重 double f; //该物品总价值 double s; //该物品性价比 bool operator <(const goods &A)const //确保sort函数将数组按照降序排列 { return s > A.s; } }buf[1000]; int main() { double m; int n; while (cin>>m>>n) { if (m == -1 && n == -1) break; for (int i = 0; i < n; i++) { cin>>buf[i].j>>buf[i].f; buf[i].s = buf[i].j / buf[i].f; } sort(buf, buf + n); int idx = 0; //当前货物下标 double ans = 0; //累加所能得到的总重量 while (m > 0 && idx < n) { if (m > buf[idx].f) { ans += buf[idx].j; m -= buf[idx].f; }//若能买下全部物品 else { ans += buf[idx].j*m / buf[idx].f; m = 0; } idx++; } printf("%.3lf", ans); } return 0; }