用贪心算法求最优解

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

算法思想:,每次都买性价比最高的产品,性价比的计算公式为(重量\价格),性价比的含义为用最少的钱买到最多的东西


#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;

struct goods{
	   double Weight;
	   double Value;
	   double xingjiabi; //性价比,重量/价值
	   bool operator <(const goods &A) const{

		   return xingjiabi > A.xingjiabi;
	   }
 }buf[1000];

int main()
{
	double m;  //m元钱
	int n;		//n种物品
	cout<<"输入m元钱,n种物品"<<endl;
	while(cin>>m>>n){
		//cout<<m<<endl<<n<<endl;
		if(m == -1 && n== -1) break;
		for(int i=0; i<n; i++){
			cin>>buf[i].Weight>>buf[i].Value; //输入i种物体的重量和价值
			buf[i].xingjiabi = buf[i].Weight / buf[i].Value; //计算性价比
		}
		sort(buf,buf+n);  //按性价比降序排列
		int idx = 0; //当前货物下表
		double sumWeight = 0; //累加所能得到的总重量
		while(m>0 && idx < n){ //循环条件为,既有物品剩余(idx < n)还有钱剩余(m > 0)时继续循环
			if(m > buf[idx].Value ){
				sumWeight += buf[idx].Weight; //若能买下该种物品的全部物品
				m -= buf[idx].Value;

			}else{
				sumWeight += buf[idx].Weight * m / buf[idx].Value;  //按性价比买东西
				m = 0;   //钱全部花完

			}//若能买下该种物品的部分物品
			idx++; //继续下一个物品
		}
		cout<<"所得到的总重量:"<<sumWeight<<endl;

	}

   return 0;
}



猜你喜欢

转载自blog.csdn.net/Shiliang3/article/details/43343927