喝汽水问题

19 篇文章 2 订阅
5 篇文章 17 订阅

  喝汽水问题

问题描述:

  1.某学院有m个学生参加南湖春游,休息时喝汽水。南湖商家公告如下:

   (1) 买一瓶汽水定价1.40元,喝1瓶汽水(不带走)1元。

   (2) 为节约资源,规定3个空瓶可换回1瓶汽水,或20个空瓶可换回7瓶汽水。

   (3) 为方便顾客,可先借后还。例如:借1瓶汽水,还3个空瓶;或借7瓶汽水,还20个空瓶。

   问:m个学生每人喝1瓶汽水(不带走),至少需要多少元?

  编程实现,输入正整数m(2<m<10000),输出至少需多少元(精确到小数点后2位)。

问题分析:

   这可以使用贪婪算法解决。

   A.首先,如果人数为20人,买13瓶汽水,借7瓶,喝完后归还20个空瓶(可换7瓶,还给商家),两清。 

   此时的花费为:    13/20*1.40 = 0.91元

   B.如果为3人,买2瓶,借1瓶,3个空瓶归还,两清。

   此时花费为:  2/3 *1.40 = 0.93元

   C.如果只有2或1人,每人喝1瓶,此时每人花1元。

   D.注意到0.91 < 0.93 < 1,因此最省钱的算法为:

   先将m个人分为 x = m / 20 个大组,每组买13瓶即可。

   再将剩下的 t = m - x*20 人,分为 y  = t/3 个小组,每组买2瓶即可。

   剩下最后的1或两人,每人花1元喝1瓶。

   最低花费为: (13*x+2*y)*1.40 +t (元)

程序实现:

/*
 * 问题:喝汽水问题
 * 时间:2013/11/17
 * Blog:http://blog.csdn.net/u012027907
 */
#include <stdio.h>

void DrinkWater()
{
	int m,t,x,y;
	double money;
	printf("请输入学生数:");
	scanf("%d",&m);

	x = m/20;                  //分x个大组,每组买13瓶,借7瓶
	t = m - 20*x;              //剩下大组外的7人
	y = t / 3;                 //剩下的7人分成y个小组,每组买2瓶汽水,借1瓶
	t = m - 20*x - 3*y;        //剩下大小组外的人,每人花1元喝1瓶
    money = (13*x + 2*y)*1.40+t;//计算花的钱

	printf("喝%d瓶汽水,至少需要:%.2f元。\n",m,money);
}
void main()
{
	DrinkWater();
}

运行截图:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值