课堂练习之买书问题
一、题目
在节假日的时候,书店一般都会做促销活动。由于《哈利波特》系列相当畅销,店长决定通过促销活动来回馈读者。在销售的《哈利波特》平装本系列中,一共有五 卷,用编号0, 1, 2, 3, 4来表示。假设每一卷单独销售均需要8欧元。如果读者一次购买不同的两卷,就可以扣除5%的费用,三卷则更多。假设具体折扣的情况如下:
本数 折扣
2 5%
3 10%
4 20%
5 25%
在一份订单中,根据购买的卷数以及本书,就会出现可以应用不同折扣规则的情况。但是,一本书只会应用一个折扣规则。比如,读者一共买了两本卷一,一本卷二。那么,可以享受到5%的折扣。另外一本卷一则不能享受折扣。如果有多种折扣,希望能够计算出的总额尽可能的低。
要求根据这样的需求,设计出算法,能够计算出读者所购买一批书的最低价格。
二、思路分析
在小于5本的情况下,直接按折扣买就好了:
2 5%
3 10%
4 20%
5 25%
在大于5本的情况下,买法如下(对应折扣=本数*折扣):
本数 可能的分解本数 对应的折扣
6 =5+1 1.25
7 =5+2 1.35
8 =4+4 1.6
9 =5+4 2.05
10 =5+5 2.5
在大于10本的情况下,可以分解为以上小于10本的情况来计算。
设n为输入的书本数,当(n%5!=3)成立时,则对应上面的6,7,9三种折扣,当(n%5==3&&n!=3)成立时,则对应上面的8的折扣。
三、程序源码
1 #include<iostream.h> 2 void main() 3 { 4 double b,sum; 5 int a,i,c; 6 cout<<"*********书店促销*********"<<endl; 7 cout<<"****本数********折扣******"<<endl; 8 cout<<"***** 2 ******** 5% ******"<<endl; 9 cout<<"***** 3 ******** 10% ******"<<endl; 10 cout<<"***** 4 ******** 20% ******"<<endl; 11 cout<<"***** 5 ******** 25% ******"<<endl; 12 cout<<"***************************"<<endl; 13 cout<<"请输入要购买的书的数目:"; 14 cin>>i; 15 if(i%5!=3) 16 { 17 a=i/5; 18 b=30*a; 19 c=i%5; 20 if(c==0) 21 { 22 sum=b; 23 } 24 if(c==1) 25 { 26 sum=b+8; 27 } 28 else if(c==2) 29 { 30 sum=b+16*0.95; 31 } 32 else if(c==3) 33 { 34 sum=b+24*0.9; 35 } 36 else if(c==4) 37 { 38 sum=b+32*0.8; 39 } 40 41 } 42 else if(i==3) 43 { 44 sum=24*0.9; 45 } 46 else if(i%5==3&&i!=3) 47 { 48 a=i/5; 49 b=30*(a-1); 50 c=i%5; 51 sum=b+32*0.8*2; 52 } 53 cout<<"最划算的价格为:"<<sum<<endl; 54 }
四、运行截图
五、结论与体会
经过查阅资料,我知道了这个题目的算法是贪心算法,网上介绍了很多关于贪心算法,也有很多的类似题目,通过本次课堂练习,基本了解了这个题目的意思和解决办法,
但是,还是有很多地方需要自己去学习,希望以后能够写出更好的算法解决这类问题。