問題描述
"嘟嘟嘟嘟嘟嘟
喇叭響
我是汽車小司機
我是小司機
我爲祖國運輸忙
運輸忙"
這是兒歌“快樂的小司機”。話說現在當司機光有紅心不行,還要多拉快跑。多拉不是超載,是要讓所載貨物價值最大,特別是在當前油價日新月異的時候。司機所拉貨物爲散貨,如大米、麪粉、沙石、泥土......
現在知道了汽車核載重量爲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);
}