课堂练习之买书问题

一、题目

    在节假日的时候,书店一般都会做促销活动。由于《哈利波特》系列相当畅销,店长决定通过促销活动来回馈读者。在销售的《哈利波特》平装本系列中,一共有五 卷,用编号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 }

四、运行截图

五、结论与体会

    经过查阅资料,我知道了这个题目的算法是贪心算法,网上介绍了很多关于贪心算法,也有很多的类似题目,通过本次课堂练习,基本了解了这个题目的意思和解决办法,

但是,还是有很多地方需要自己去学习,希望以后能够写出更好的算法解决这类问题。

原文地址:https://www.cnblogs.com/yuji5656/p/4428318.html