贪心是一种总是选择“当前最好选择”,而不从整体上去把握的思想,往往这种“贪心”的策略能得到接近最优的结果,甚至某些情况下就是最优解。
例2.11 FatMouse‘Trade(1433)
题目大意如下:有n元钱,m种物品;每种物品有j磅,总价值f元,可以使用0到f的任意价格购买相应磅的物品,例如使用0.3f元,可以购买0.3j磅物品。要求输出用m元钱最多能买到多少磅物品。
样例输入: 5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1 样例输出: 13.333 31.500
#include<stdio.h> #include<algorithm> using namespace std; struct goods{ double j; double f; double s;//性价比 bool operator <(const goods &A)const{ return s>A.s; } }buf[1000]; int main(){ int n,m; while(scanf("%d%d",&n,&m)!=EOF){ if(n==-1&&m==-1) break; for(int i=1;i<=m;i++){ scanf("%lf%lf",&buf[i].j,&buf[i].f); buf[i].s=buf[i].j/buf[i].f;//价格除以钱 } sort(buf+1,buf+1+m); double res=0;//累计重量 double quo=0;//商 for(int i=1;i<=m;i++){ if(n>=buf[i].f){ res+=buf[i].j; n-=buf[i].f; } else{ quo=n/buf[i].f; res+=quo*buf[i].j; break; } } printf("%.3lf\n",res);//保留三位小数 } return 0; }
例2.12 今年暑假不AC (1434)
这道题的贪心策略并不是很明显,但有了思路也很简单,就懒得敲了,直接po一个链接:http://blog.csdn.net/lecholin/article/details/65979763