1. 程式人生 > >用貪心演算法求最優解

用貪心演算法求最優解

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