题目:书店针对《哈利波特》系列书籍进行促销活动,一共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),看组合和最大则取之。比自己考虑的存在特殊情况,而这种方法不会存在特里。
多发现自己与他人的不同,分析过程,找到不足。