贪心算法实例

题目:有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;
}




运行截图


贪心算法实例_第1张图片


你可能感兴趣的:(算法,贪心算法)