• 课堂练习之购书最低价格


    问题描述:

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

                           本数 折扣

                           2     5%

                           3     10%

                           4     20%

                           5     25%

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

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

    设计思想:

     1)根据购买书的数量n,依次循环从6本开始计算最低的价格,直至计算到n对应的最低价格;

         n对应最低价格计算,则也是循环从1+(n-1)价格,直至计算到n/2+n/2(或前一个数大于后一个数的组合),比较得出最低价格,和最优惠的方案。

    这种算法的时间复杂度很大,但是算法写起来简单。

    2)由前5本的对应的最低价格,往后推出6-10的最低价格及其方案,可看出其中的规律,那就是大于5本的情况,只有购买n/5套书,在购买不同的n%5本不同卷书就是最     便宜的,但是其中有一种情况除外,那就是最后余数为3的情况下,因为买8本时,最优惠方案为4+4。所以只需对这一种特殊情况考虑除外即可。

    这种算法时间复杂度小,但是思考算法时比较多。

    代码实现:

     方案1:

    //根据购买书的数量的打折优惠,计算出最优价格
    //范亚雷   2016.05.31
    
    import javax.swing.JOptionPane;
    
    public class Book {
        public static void main(String[] args){
            String inputNumber = JOptionPane.showInputDialog("请输入要购买书的数量:");
            int Number=Integer.parseInt(inputNumber);
            
            //最优惠的价格数组
            double[] Min=new double[Number+1];
            Min[0]=0;Min[1]=8.00;Min[2]=15.20;Min[3]=21.60;Min[4]=25.60;Min[5]=30.00;
            //最优惠的方案
            String[] Plan=new String[Number+1];
            Plan[0]="0";Plan[1]="1";Plan[2]="2";Plan[3]="3";Plan[4]="4";Plan[5]="5";
            
            //循环计算出最优价格和方案
            int i=6;
            while(i<=Number)
            {
                if(Number<=5)
                {
                    break;
                }
                else
                {
                    Min[i]=i*8;
                    Plan[i]="1*"+i;
                    int com1=1,com2=i-1;
                    //寻找出最优惠的组合方案
                    while(com1<=com2)
                    {
                        if(Min[com1]+Min[com2]<Min[i])
                        {
                            Min[i]=Min[com1]+Min[com2];
                            Plan[i]=Plan[com1]+"+"+Plan[com2];
                            //System.out.println(Min[i]+" "+Plan[i]);
                        }
                        com1=com1+1;
                        com2=com2-1;
                    }
                    
                    i=i+1;
                }
            }
            JOptionPane.showMessageDialog(null,"购买"+Number+"本书最优惠的价格为:"+"
    "+Min[Number]+"
    "+"购买方案为:"+"
    "+Plan[Number]+"
    "+"(方案解释:例如:”1+2“则意思是购买两本不同卷再加上一卷。)",
                    "最优结果:",JOptionPane.PLAIN_MESSAGE);
        }

    方案2:

    //根据购买书的数量的打折优惠,计算出最优价格
    //范亚雷   2016.05.31
    
    import javax.swing.JOptionPane;
    
    public class Books {
        public static void main(String[] args){
            String inputNumber = JOptionPane.showInputDialog("请输入要购买书的数量:");
            int Number=Integer.parseInt(inputNumber);
            double[] Min=new double[]{0,8.00,15.20,21.60,25.60,30.00};
            String[] Plan=new String[]{"不购买","购买1卷","购买不同的2卷","购买不同的3卷","购买不同的4卷","购买不同的5卷"};
            
            double MinNum=8*Number;
            String PlanNum="1*"+Number;
            if(Number>5)
            {
                int shang=Number/5;
                int yushu=Number%5;
                if(yushu==3)
                {
                    MinNum=(shang-1)*30+25.6*2;
                    PlanNum="购买不同的5卷"+"*"+(shang-1)+",再购买不同的4卷"+"*2";
                }
                else
                {
                    MinNum=shang*30+Min[yushu];
                    PlanNum="购买不同的5卷"+"*"+shang+",再购买不同的"+yushu+"卷";
                }
                    
            }
            else
            {
                MinNum=Min[Number];
                PlanNum=Plan[Number];
            }
            
            JOptionPane.showMessageDialog(null,"购买"+Number+"本书最优惠的价格为:"+"
    "+MinNum+"
    "+"购买方案为:"+"
    "+PlanNum,
                    "最优结果:",JOptionPane.PLAIN_MESSAGE);
        }
    }

    实现截图:

     方案1:

    方案2:

    个人总结:

    对于一个问题要多发现其中的规律,减少电脑不必要的计算。算法尽量要实现精明简要,这样减少bug的出现,也提高效率。

  • 相关阅读:
    顺序栈的模拟
    Maven安装教程详解
    C# CRC
    Oracle知识分类之常见规范
    Oracle知识分类之异常
    el-tree树结构的数据封装
    sessionStorage和localStorage
    el-form 中为el-input 添加正则校验 以及el-input正则限制
    动态组件与父子传值的灵活应用 ref控制子组件 props,emit传值
    el-tree树组件的封装 (运用递归对接口返回当前菜单数据为对象处理)
  • 原文地址:https://www.cnblogs.com/fan-xiaofan/p/5548868.html
Copyright © 2020-2023  润新知