基础算法——贪心算法(圣诞老人的礼物)

题目是这样的:

圣诞节来临了,中圣诞老人准备分发糖果现在有多箱不同的糖果, 每箱糖果有自己的价值和重量,每箱糖果都可以拆分成任意散装组合带走。圣诞老人的驯鹿雪橇最多只能装下重量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;
} 

当然除了样例输出的结果我们要保证正确之外,还要测试一些特殊数据比如临界值等等

运行结果

运行结果

 

猜你喜欢

转载自blog.csdn.net/cj151525/article/details/84455158
今日推荐