`

编程之美-买书折扣

 
阅读更多


import java.util.Arrays;

public class BookDiscount {

	/**编程之美 买书折扣

书上的贪心算法的分析很有意思,我看了半天看不懂,结果作者说,贪心算法在这个问题上是不适用的。。
下面用动态规划实现。
哈利波特这本书一共有五卷,每卷都是8欧元,如果读者一次购买不同的两卷可扣除5%的折扣,三卷10%,四卷20%,五卷25%。现在我要买很多本书,应该怎么组合才最省钱?
我们用F(Y1,Y2,Y3,Y4,Y5)表示这五卷书分别Yi本时的最少花销。
由于购买(2本卷一其余只购1本)和购买(2本卷二其余只购1本)(因为每卷书的价格是一样的,因此书的顺序是无所谓的)的最少花销是一样的,即F(2,1,1,1,1)=F(1,2,1,1,1)=F(1,1,2,1,1)=......。
我们用F(2,1,1,1,1)来代表这一组方案的“最小表示”,即在一个最小表示F(Y1,Y2,Y3,Y4,Y5)中满足Y1>=Y2>=Y3>=Y4>=Y5。
用动态规划我们可以建立状态转移方程:
F(Y1,Y2,Y3,Y4,Y5)
=0                                                              if(Y1=Y2=Y3=Y4=Y5=0)
=min{
        40*0.75+F(Y1-1,Y2-1,Y3-1,Y4-1,Y5-1) ,                   if(Y5>=1)
        32*0.8+F(Y1-1,Y2-1,Y3-1,Y4-1,Y5)  ,                     if(Y4>=1)
        24*0.9+F(Y1-1,Y2-1,Y3-1,Y4,Y5) ,                        if(Y3>=1)
        16*0.95+F(Y1-1,Y2-1,Y3,Y4,Y5) ,                         if(Y2>=1)
        8+F(Y1-1,Y2,Y3,Y4,Y5) ,                                 if(Y1>=1)
}
状态转移之后得到的F(Y1-1,Y2-1,Y3-1,Y4-1,Y5)等可能不是“最小表示”,要把它转化为对应的“最小表示”。

	 */
	
	
	public static void main(String[] args) {
		BookDiscount bookDiscount=new BookDiscount();
		int[][] books={
				{2,2,2,1,1},
				{4,3,2,1,0}
		};
		for(int[] each:books){
			double min=bookDiscount.findMinCost(each[0],each[1],each[2],each[3],each[4]);
			System.out.println(Arrays.toString(each)+",min cost="+min);
		}
	}

	public double findMinCost(int Y1,int Y2,int Y3,int Y4,int Y5){
		int[] x={Y1,Y2,Y3,Y4,Y5};
		Arrays.sort(x);
		if(x[0]<0){
			System.out.println("购书数量不能为负数");
			return 0;
		}
		//Y1>=Y2>=Y3>=Y4>=Y5
		Y5=x[0];
		Y4=x[1];
		Y3=x[2];
		Y2=x[3];
		Y1=x[4];
		double cost=0;
		if(Y5>=1){
			cost=min(
					8*5*(1-0.25)+findMinCost(Y1-1,Y2-1,Y3-1,Y4-1,Y5-1),
					8*4*(1-0.20)+findMinCost(Y1-1,Y2-1,Y3-1,Y4-1,Y5),
					8*3*(1-0.10)+findMinCost(Y1-1,Y2-1,Y3-1,Y4,Y5),
					8*2*(1-0.05)+findMinCost(Y1-1,Y2-1,Y3,Y4,Y5)
				);
		}else if(Y4>=1){
			cost=min(
					8*4*(1-0.20)+findMinCost(Y1-1,Y2-1,Y3-1,Y4-1,Y5),
					8*3*(1-0.10)+findMinCost(Y1-1,Y2-1,Y3-1,Y4,Y5),
					8*2*(1-0.05)+findMinCost(Y1-1,Y2-1,Y3,Y4,Y5)
				);
		}else if(Y3>=1){
			cost=min(
					8*3*(1-0.10)+findMinCost(Y1-1,Y2-1,Y3-1,Y4,Y5),
					8*2*(1-0.05)+findMinCost(Y1-1,Y2-1,Y3,Y4,Y5)
				);
		}else if(Y2>=1){
			cost=min(
					8*2*(1-0.05)+findMinCost(Y1-1,Y2-1,Y3,Y4,Y5)
				);
		}else if(Y1>=1){//{Y1,0,0,0,0},说明买的是同一卷书,没有折扣
			cost=8*Y1;
		}else{//{0,0,0,0,0}
			cost=0;
		}
		return cost;
	}
	
	public double min(double y,double...yy){
		double m=y;
		for(double e:yy){
			if(m>e){
				m=e;
			}
		}
		return m;
	}
}

0
5
分享到:
评论
3 楼 bylijinnan 2012-07-05  
tochange_2011 写道
问一下“最小表示”是高数中的定义吗?

不是高数的定义
因为F(2,1,1,1,1)=F(1,2,1,1,1)=F(1,1,2,1,1).....
把数字由大到小排列的F(x1,x2,x3,x4,x5)称为“最小表示”,也可以叫其他名称
这样带来的编程要求就是每次进入F函数要先排序
2 楼 tochange_2011 2012-07-04  
问一下“最小表示”是高数中的定义吗?
1 楼 tochange_2011 2012-07-04  
木看懂!

相关推荐

    购物-有用折扣最新版 v2.4.0.zip

    安卓应用通常由一系列的组件(如Activity、Service、BroadcastReceiver和ContentProvider)组成,这些组件通过XML布局文件定义用户界面,并用Java或Kotlin等编程语言编写业务逻辑。"最新版 v2.4.0"表明该应用已经过...

    【精品教程】游戏编程入门

    【游戏编程入门】这篇教程是针对零基础的潜在游戏开发者设计的,旨在引导他们逐步进入游戏开发的世界。首先,文章强调了选择一门合适的编程语言的重要性。作者推荐从C和C++开始,尽管这两种语言可能对新手来说较为...

    Programming And Problem Solving With C++ Comprehensive

    - 问题解决在编程中是核心能力之一,涉及分析问题、设计解决方案和编写代码。 - 有效的编程问题解决需要明确问题描述、理解需求和设计合理的算法。 - 调试是问题解决过程中的重要环节,涉及识别程序中的错误并修正...

    合肥市信息学竞赛-小学组-2017.pdf

    - 需要考虑的条件包括新华书店和网上购买图书的折扣情况,以及购买数量与价格的关系。 - 最少花费(cost): - 此题考查学生对最小花费问题的解决能力,给出不同文具包装的数量和价格,要求学生计算购买特定数量...

    C#游戏编程入门

    C#(发音为“看井”)是一种由微软开发的面向对象的编程语言,它是.NET框架的核心语言之一,广泛应用于企业级应用程序开发,而其在游戏开发领域的应用主要得益于微软的XNA游戏工作室和如今的Unity游戏引擎。...

    OpenCL编程指南(英文原版)

    书中可能包含基础概念的解释,编程范式的介绍,以及如何使用OpenCL API进行开发的步骤和示例。对于希望入门OpenCL并行计算的开发者来说,这本书将是一个良好的起点。 标签“OpenCL”强调了文档的主要内容,即关于...

    最经典Java 教材

    对于希望批量购买本书的企业和个人,Sams Publishing提供了优惠折扣政策。美国境内可联系1-800-382-3419或通过电子邮件corpsales@pearsontechgroup.com进行咨询。对于海外购买需求,可以通过international@pearsoned...

    数据库课程设计报告-图书销售管理系统.docx

    - 图书(Book):包含图书号、类型、名称、作者、出版社、价格、积分、折扣、封面图片和简介等字段。 - 会员(User):包含会员ID、用户名、密码、积分、等级、邮箱等字段。 - 订单(Order):涉及订单号、订单细节...

    游戏编程入门

    游戏编程入门是许多对编程感兴趣的人希望涉足的领域,尤其是对于那些热爱游戏的人来说。这个话题主要涵盖了从零开始学习游戏开发所需要的基本步骤、知识和工具,以及如何逐步建立起自己的游戏项目。 首先,选择合适...

    3个完全不同的书店管理系统以及参考书

    4. **参考书**:提供的参考书可能涵盖了编程基础、C++进阶、数据库管理、GUI编程等方面,旨在帮助读者深入理解书店管理系统背后的原理和技巧,提升编程技能。 5. **系统实现** - **库存管理**:系统可能包含了库存...

    McGraw.Hill.-.The.Ultimate.Palm.Robot.pdf

    - **批量购买折扣**:为促销、奖品或筹款活动安排批量购买折扣,请联系 McGraw-Hill/Osborne。 - **国际联系信息**:关于翻译或美国境外的图书分销信息,请参阅本书索引后的国际联系信息页面。 #### 五、结语 ...

Global site tag (gtag.js) - Google Analytics