题目:书店针对《哈利波特》系列书籍进行促销活动,一共5卷,用编号0、1、2、3、4表示,单独一卷售价8元, 具体折扣如下所示:

                               本数                  折扣

                                2                    5%

                                3                    10%

                                4                    20%

                                5                    25%

根据购买的卷数以及本数,会对应不同折扣规则情况。单数一本书只会对应一个折扣规则,例如购买了两本卷1,一本卷2,则可以享受5%的折扣,另外一本卷一则不享受优惠。

设计算法能够计算出读者购买一批书的最低价格。

 

思路:

  如果书的数量是10的倍数,很容易看出,分成两套5本买是最便宜的,故只用考虑余下单本(1~9)的情况,并且1~5本的最低折扣题目也已经给出,则再分析6~9本的即可。

枚举出每一种情况:

(6本)

1本+5本:=38元(最低)

2本+4本:=40.8元

3本+3本:=43.2元

(7本)

2本+5本:=45.2元(最低)

3本+4本:=47.2元

(8本)

3本+5本:=51.6元

4本+4本:=51.2元(最低)

(9本)

4本+5本:=55.6元(最低)

可以看出,除了8本分成两个4本的组合最划算外,其他三个都是包含5本的组合。

 

源代码:

 

#include<iostream.h>
#define price 8

int main()
{
	int mount;		//购买书的数量
	double sum;		//最低价格
	int i,j;
	cout<<"How many books you want to buy: ";
	cin>>mount;
	i=mount/10;
	sum=i*10*price*(1-0.25);
	j=mount%10;
	switch(j)
	{
	case 0:
		sum=sum;
		break;
	case 1:
		sum=sum+price;
		break;
	case 2:
		sum=sum+j*price*(1-0.05);
		break;
	case 3:
		sum=sum+j*price*(1-0.1);
		break;
	case 4:
		sum=sum+j*price*(1-0.2);
		break;
	case 5:
		sum=sum+j*price*(1-0.25);
		break;
	case 6:
		sum=sum+5*price*(1-0.25)+price;
		break;
	case 7:
		sum=sum+5*price*(1-0.25)+2*price*(1-0.05);
		break;
	case 8:
		sum=sum+4*price*(1-0.2)*2;		//余8的情况特殊
		break;
	case 9:
		sum=sum+5*price*(1-0.25)+4*price*(1-0.2);
		break;	
	}
	cout<<"the lower price: "<<sum<<endl;
} 

 

运行结果:

 

 

 

总结:

  时隔一段时间,又继续做课堂练习了,还好没有手生。

  分析题目,首先想到的思路就是前面写到的,并没有考虑到什么算法,但是在折扣情况很多时还一一举出所有的分类肯定很麻烦,这要求从中找到规律,设计一种适用的算法。课堂上,听了几个同学的发言,对其中一个同学的算法印象很深,同样是考虑余下单本的情况折扣率。2本(0.1)、3本(0.3)、4本(0.8)、5本(1.25),看组合和最大则取之。比自己考虑的存在特殊情况,而这种方法不会存在特里。

  多发现自己与他人的不同,分析过程,找到不足。