题目描述:
分析:
最简单的贪心算法的应用。
由于可以购买一个房间中的部分JavaBeans,直接将所有的JavaBeans按单价由高到低排序,然后贪心购买即可。最后购买的那个房间可能只购买其中的一部分JavaBeans。
源码:
#include <stdio.h>
void bubbleSort(float price[], int J[], int F[], int N);
main()
{
int M, N;
int J[1000], F[1000]; //JavaBeans和cat food的重量
float price[1000]; //JavaBeans的单价
scanf("%d%d", &M, &N);
float result;
while (!(M==-1 && N==-1))
{
for (int i = 0; i < N; i ++)
{
scanf("%d%d", &J[i], &F[i]);
price[i] = (float)F[i] / (float)J[i];
}
//按单价由低到高对所有仓库进行排序
bubbleSort(price, J, F, N);
int sumF = 0, sumJ = 0;
for (int i = 0; i < N; i ++)
sumF = sumF + F[i];
for (int i = 0; i < N; i ++)
sumJ = sumJ + J[i];
//如果cat food足够多,则可以买下全部的JavaBeans
if (M >= sumF)
result = sumJ;
//cat food只能买一部分仓库中的JavaBeans,贪心购买
else
{
result = 0;
int i = 0;
while (M > 0)
{
if (M > F[i])
{
result = result + J[i];
M = M - F[i];
i ++;
}
else
{
result = result + (float)M / (float)F[i] * (float)J[i];
M = 0;
}
}
}
printf("%.3f\n", result);
scanf("%d%d", &M, &N);
}
}
void bubbleSort(float price[], int J[], int F[], int N)
{
float floatTemp;
int intTemp;
for (int i = 0; i < N-1; i ++)
{
for (int k = N-1; k > i; k --)
{
if (price[k] < price[k-1])
{
floatTemp = price[k];
price[k] = price[k-1];
price[k-1] = floatTemp;
intTemp = J[k];
J[k] = J[k-1];
J[k-1] = intTemp;
intTemp = F[k];
F[k] = F[k-1];
F[k-1] = intTemp;
}
}
}
}