算法提高 快樂司機 【C++】

問題描述

  "嘟嘟嘟嘟嘟嘟
  喇叭響
  我是汽車小司機
  我是小司機
  我爲祖國運輸忙
  運輸忙"
  這是兒歌“快樂的小司機”。話說現在當司機光有紅心不行,還要多拉快跑。多拉不是超載,是要讓所載貨物價值最大,特別是在當前油價日新月異的時候。司機所拉貨物爲散貨,如大米、麪粉、沙石、泥土......
  現在知道了汽車核載重量爲w,可供選擇的物品的數量n。每個物品的重量爲gi,價值爲pi。求汽車可裝載的最大價值。(n<10000,w<10000,0<gi<=100,0<=pi<=100)

輸入格式

  輸入第一行爲由空格分開的兩個整數n w
  第二行到第n+1行,每行有兩個整數,由空格分開,分別表示gi和pi

輸出格式

  最大價值(保留一位小數)

樣例輸入

5 36
99 87
68 36
79 43
75 94
7 35

樣例輸出

71.3
解釋:
先裝第5號物品,得價值35,佔用重量7
再裝第4號物品,得價值36.346,佔用重量29
最後保留一位小數,得71.3

 

/****************************************************
*解題思路:
*1.貪心快排
*2.我們可以先用價值除以重量,算出每一物品單位重量所具有的價值
*3.利用快速排序,將單位價值進行排序
*4.從單位價值高的物品開始存放,直到重量達到限制
****************************************************/
#include<iostream>
#include<iomanip>
using namespace std;
class test    //存放商品的重量,價值,單位價值
{
	public:
	double num;
	double wt;
	double vb;
};

void qsort(int left,int right,test a[]) //快速排序
{
	if(left > right)
	{
		return ;
	}
	int i,j;
	double temp;
	test t,ta;
	ta = a[left];
	i = left;
	j = right;
	temp = a[left].vb;
	while(i != j)
	{
		while(a[j].vb >= temp && i < j)
		{
			j--;
		}
		while(a[i].vb <= temp && i < j)
		{
			i++;
		}
		if(i < j)
		{
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}
	a[left] = a[i];
	a[i] = ta;

	qsort(left,i-1,a);
	qsort(i+1,right,a);
}

int main()
{
	int n,value;
	test a[10005];
	cin >> n >> value;
	for(int i = 1;i <= n;i++)
	{
		cin >> a[i].num >> a[i].wt;
		a[i].vb = a[i].wt/ a[i].num;
	}
	qsort(1,n,a);
	double sum = 0,weight = 0;
	for(int i = n;i > 0;--i)
	{
		weight += a[i].num;
		if(weight <= value)
		{
			sum += a[i].wt;
		}
		else 
		{
			sum += (a[i].num+value - weight)*a[i].vb;
			break;
		}
	
	}
	cout << fixed << setprecision(1) << sum ;
}

 

/*********快速排序整型參數版本(僅供參考)**********************/
void qsort(int left,int right,int a[])
{
	if(left > right)
	{
		return ;
	}
	int i,j,temp,t;
	i = left;
	j = right;
	temp = a[left];
	while(i != j)
	{
		while(a[j] >= temp && i < j)
		{
			j--;
		}
		while(a[i] <= temp && i < j)
		{
			i++;
		}
		if(i < j)
		{
			t = a[i];
			a[i] = a[j];
			a[j] = t;
		}
	}

	a[left] = a[i];
	a[i] = temp;
	qsort(left,i-1,a);
	qsort(i+1,right,a);
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章