题目是这样的:
圣诞节来临了,中圣诞老人准备分发糖果现在有多箱不同的糖果, 每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿雪橇最多只能装下重量W的糖果,请问圣诞老人最多能带走多大价值的糖果。
4表示四种糖果,下面跟着四行数据,第一个表示价值,第二个表示重量,15表示圣诞老人的雪橇能装下的最大重量:1193.0表示能带走的最大价值
样例输入:
4 15
100 4
412 8
266 7
591 2
样例输出
1193.0
思路:当然是拿 价值/重量 比 最大的,通俗一点就是单价最高的嘛!我们可以将每一种糖果封装成一个结构体,有价值、重量、 价值/重量比 三个属性。然后按照价值/重量比从大到小排序。先拿第一个结构体数组,如果不够再拿第二个......这样就是一个贪心算法的思路——从问题的局部出发,不考虑整体,然后由局部解构成整体解。排序我们可以采用快排,看代码
#include<stdio.h>
typedef struct{
int value;
int weight;
double price;
}Candy;
//交换结构体
void swap(Candy &a,Candy & b)
{
Candy temp;
temp=a;
a=b;
b=temp;
}
void QuickSort(Candy a[],int left,int right)
{
int i=left;
int j=right;
double key=a[left].price;
if(left>=right)
{
return ;
}
while(i!=j)
{
while(j>i&&a[j].price<=key)
j--;
swap(a[i],a[j]);
while(j>i&&a[i].price>=key)
i++;
swap(a[i],a[j]);
}
QuickSort(a,left,i-1);
QuickSort(a,i+1,right);
}
int main()
{
//totalV 是能拿走的总价值
//keepW 是雪橇还能拿的重量
int i;double totalV=0.0;
int keepW=0;
int N,W;
Candy a[100];
scanf("%d%d",&N,&W);
for(i=0;i<N;i++)
{
scanf("%d%d",&a[i].value,&a[i].weight);
a[i].price=(double)a[i].value/(double)a[i].weight;
}
QuickSort(a,0,N-1);
i=0;
keepW=W;
while(keepW>0)
{
//如果能拿的重量大于该糖箱糖果重量,则全拿
if(keepW>=a[i].weight)
{
keepW-=a[i].weight;
totalV+=a[i].weight*a[i].price;
a[i].weight-=a[i].weight;
}
//否则只能拿 雪橇剩下的重量
else
{
totalV+=keepW*a[i].price;
keepW-=keepW;
a[i].weight-=keepW;
}
i++;
}
printf("%.1lf\n",totalV);
return 0;
}
当然除了样例输出的结果我们要保证正确之外,还要测试一些特殊数据比如临界值等等
运行结果