贪心算法实例

题目:有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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值