HUSTOJ 1072 小数背包问题
题目描述
有一个背包,背包容量是M(0<M≤500),有N(1<N≤1000)个物品,物品可以分割成任意大小。
要求尽可能让装入背包中的物品总价值最大,但不能超过总容量。
输入
第1行有两个数,M和N;
第2行到N+I行:第i行为第i-1个物品的价值和质量(均为小于100的正整数),中间用空格隔开。
输出
只有一个数为最大总价值(保留一位小数)。
样例输入
150 7
10 35
40 30
30 60
50 50
35 40
40 10
30 25
样例输出
190.6
思路:贪心,因为物品可以分成任意大小,所以要按照性价比来排序
#include<algorithm> #include<cstring> #include<cstdio> using namespace std; int n; double m, ans; struct nond { int val, m; double tmp; }e[1005]; bool cmp(nond x, nond y) { return x.tmp > y.tmp; } int main() { scanf("%lf%d", &m, &n); for(int i = 1; i <= n; i++) { scanf("%d%d", &e[i].val, &e[i].m); e[i].tmp = 1.0 * e[i].val / e[i].m; } sort(e + 1, e + n + 1, cmp); int i = 1; while(m > 0) { if(e[i].m <= m) { m -= e[i].m; ans += e[i].val; } else { ans += m * e[i].tmp; break; } i++; } printf("%.1lf\n", ans); return 0; }