课堂练习之购书最低价格

问题描述:

书店针对《哈利波特》系列书籍进行促销活动,一共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+"本书最优惠的价格为:"+"\n"+Min[Number]+"\n"+"购买方案为:"+"\n"+Plan[Number]+"\n"+"(方案解释:例如:”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+"本书最优惠的价格为:"+"\n"+MinNum+"\n"+"购买方案为:"+"\n"+PlanNum,
                "最优结果:",JOptionPane.PLAIN_MESSAGE);
    }
}

实现截图:

 方案1:

方案2:

个人总结:

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

posted @ 2016-06-01 10:58  Fanyalei  阅读(166)  评论(0编辑  收藏  举报