问题描述:
书店针对《哈利波特》系列书籍进行促销活动,一共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的出现,也提高效率。