贪心算法实例

来源:互联网 发布:淘宝客服简历模板 编辑:程序博客网 时间:2024/04/19 00:43

题目:有m元钱,n种物品;每种物品有j磅,总价值f元,可以使用0到f的任意价格购买相应磅的物品,例如使用0.3f元,可以购买0.3j磅物品。要求输出用m元钱最多能买到多少磅物品。

算法思想:本例基于贪心思想,我们每次都尽可能的多买性价比高的物品直到该物品被买完或者金钱耗尽。

实现过程:每次都买剩余物品中性价比(即重量价格比)最高的物品,直到该物品被买完或者钱被耗尽。若该物品已经被买完,则我们继续在剩余的物品中寻找性价比最高的物品,重复该过程;若金钱耗尽,则交易结束。

 源代码

#include<stdio.h>#include<algorithm>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(scanf("%lf%d",&m,&n)!=EOF){if(m==-1&&n==-1)//当n==-1且m==-1时跳出循环,程序运行结束break;for(int i=0;i<n;i++){scanf("%lf%lf",&buf[i].j,&buf[i].f);//输入n组物品的总重和总价值buf[i].s=buf[i].j/buf[i].f;//计算性价比,存入到结构体goods的性价比属性中}sort(buf,buf+n);//使各物品按照性价比降序排列int idx=0;//当前货物下标double ans=0;//累加所能得到的总重量while(m>0&&idx<n){//循环条件为,既有物品剩余(idx<n)还有钱剩余(m>0)时继续循环if(m>buf[idx].f){ans+=buf[idx].j;m-=buf[idx].f;}//若能买下全部该物品else{//ans+=buf[idx].j*m/buf[idx].f;ans+=buf[idx].s*m;m=0;}//若只能买下部分该物品idx++;//继续下一个物品}printf("%.3lf\n",ans);//输出}return 0;}

运行截图




0 0
原创粉丝点击