- 浏览: 21919 次
- 性别:
- 来自: 南京
最新评论
题目:在节假日的时候,书店一般都会做促销活动。由于《哈利波特》系列相当畅销,店长决定通过促销活动来回馈读者。在销售的《哈利波特》平装本系列中,一共有五卷,用编号0, 1, 2, 3, 4来表示。假设每一卷单独销售均需要8欧元。如果读者一次购买不同的两卷,就可以扣除5%的费用,三卷则更多。假设具体折扣的情况如下:
view sourceprint?1 本数 折扣
2 2 5%
3 3 10%
4 4 20%
5 5 25%
在一份订单中,根据购买的卷数以及本书,就会出现可以应用不同折扣规则的情况。但是,一本书只会应用一个折扣规则。比如,读者一共买了两本卷一,一本卷二。那么,可以享受到5%的折扣。另外一本卷一则不能享受折扣。如果有多种折扣,希望能够计算出的总额尽可能的低。
要求根据这样的需求,设计出算法,能够计算出读者所购买一批书的最低价格。
分析:
首先假设五册书分别为A,B,C,D,E,不失一般性可以假设Na>=Nb>=Nc>=Nd>=Ne,设所有书可以划分为k组,每组中书不重复,则在最优解中有如下性质:
所有只包含一本书的组均只包含同一本书
若有两组包含一本书的组包含的书不同,则这两组合并,能得到更优解,与最优解矛盾.
包含一本书的组只包含A
若包含书为A',若Na'==Na,则A,A'对调即可,若Na'<Na,则必存在某组包含A不包含A',则将只包含A'的组并入该组能得到更优解。
所有只包含两本书的组均包含相同两本书
组(A', B'), (A',C')折扣0.2重组为(A',B',C')与(A)折扣0.3
包含两本书的组必包含A
若存在包含一本A的组,而两本书的组不包含A,则合并能得更优解。若不存在包含一本A的组,而两本书组包含为A',A'',则包含三本书,四本组必含A而缺A'者。(A', A''), (AXY), 折扣0.4不如(A''),(AXYA')0.8。(A',A''),(AXYZ)折扣0.9不如(A''),(AXYZA')1.25。
包含两本书的组必包含B
同上证。
所有只包含三本书的组均包含相同三本书
(A,B,C),(A,B,D)折扣0.6,(A,B),(A,B,C,D)折扣0.9
所有包含三本书的组均包含A
若存在只包含A的组,合并得更优。若存在只包含A, B的组(A,B)(XYZ)折扣0.4,不如(B)(AXYZ)折扣0.8。若不存在一,二本组,假设三本书组为(X,Y,Z),则必有包含A的四本组缺X,(X,Y,Z)(A,A',A'',A''')折扣1.1,不如(Y,Z),(A,A',A'',A''',X)折扣1.35
所有包含三本的组均包含B,C
同上可证
所有包含四本书的组均包含A,B,C
设XYZW为(ABC)(BCDE)折扣1.1,不如(B,C),(A,B,C,D,E)折扣1.35。其它情况同理可证。
包含五本书与包含三本书情况不会同时出现
(A,B,C),(A,B,C,D,E)折扣1.55,不如(A,B,C,D),(A,B,C,E)折扣1.6
由以上证明可得如下结论:
每组均包含A,所有组数与A相同
所有包含两本及以上的组均包含B,组数与B同
所有包含三本及以上的组均包含C,组数与C同
三,五不并存
由此可得解法如下:
view sourceprint?01 const double BuyBook::UNIT_PRICE = 8;
02 const double BuyBook::DISCOUNTS[5] = {1, 0.95, 0.9, 0.8, 0.75};
03 static const int BOOK_KINDS = 5;
04 double BuyBook::SearchFast(int* books)
05 {
06 Sort(books);
07 int g[5];
08 g[0] = books[0] - books[1];
09 g[1] = books[1] - books[2];
10 g[2] = books[2] - books[3];
11 g[3] = books[3] - books[4];
12 g[4] = books[4];
13 int t = min(g[2], g[4]);
14 if (t > 0)
15 {
16 g[2] -= t;
17 g[4] -= t;
18 g[3] += 2 * t;
19 }
20 double sum = 0;
21 for (int i = 0; i < BOOK_KINDS; ++i)
22 {
23 sum += g[i] * (i+1) * UNIT_PRICE * DISCOUNTS[i];
24 }
25 return sum;
26 }
view sourceprint?1 本数 折扣
2 2 5%
3 3 10%
4 4 20%
5 5 25%
在一份订单中,根据购买的卷数以及本书,就会出现可以应用不同折扣规则的情况。但是,一本书只会应用一个折扣规则。比如,读者一共买了两本卷一,一本卷二。那么,可以享受到5%的折扣。另外一本卷一则不能享受折扣。如果有多种折扣,希望能够计算出的总额尽可能的低。
要求根据这样的需求,设计出算法,能够计算出读者所购买一批书的最低价格。
分析:
首先假设五册书分别为A,B,C,D,E,不失一般性可以假设Na>=Nb>=Nc>=Nd>=Ne,设所有书可以划分为k组,每组中书不重复,则在最优解中有如下性质:
所有只包含一本书的组均只包含同一本书
若有两组包含一本书的组包含的书不同,则这两组合并,能得到更优解,与最优解矛盾.
包含一本书的组只包含A
若包含书为A',若Na'==Na,则A,A'对调即可,若Na'<Na,则必存在某组包含A不包含A',则将只包含A'的组并入该组能得到更优解。
所有只包含两本书的组均包含相同两本书
组(A', B'), (A',C')折扣0.2重组为(A',B',C')与(A)折扣0.3
包含两本书的组必包含A
若存在包含一本A的组,而两本书的组不包含A,则合并能得更优解。若不存在包含一本A的组,而两本书组包含为A',A'',则包含三本书,四本组必含A而缺A'者。(A', A''), (AXY), 折扣0.4不如(A''),(AXYA')0.8。(A',A''),(AXYZ)折扣0.9不如(A''),(AXYZA')1.25。
包含两本书的组必包含B
同上证。
所有只包含三本书的组均包含相同三本书
(A,B,C),(A,B,D)折扣0.6,(A,B),(A,B,C,D)折扣0.9
所有包含三本书的组均包含A
若存在只包含A的组,合并得更优。若存在只包含A, B的组(A,B)(XYZ)折扣0.4,不如(B)(AXYZ)折扣0.8。若不存在一,二本组,假设三本书组为(X,Y,Z),则必有包含A的四本组缺X,(X,Y,Z)(A,A',A'',A''')折扣1.1,不如(Y,Z),(A,A',A'',A''',X)折扣1.35
所有包含三本的组均包含B,C
同上可证
所有包含四本书的组均包含A,B,C
设XYZW为(ABC)(BCDE)折扣1.1,不如(B,C),(A,B,C,D,E)折扣1.35。其它情况同理可证。
包含五本书与包含三本书情况不会同时出现
(A,B,C),(A,B,C,D,E)折扣1.55,不如(A,B,C,D),(A,B,C,E)折扣1.6
由以上证明可得如下结论:
每组均包含A,所有组数与A相同
所有包含两本及以上的组均包含B,组数与B同
所有包含三本及以上的组均包含C,组数与C同
三,五不并存
由此可得解法如下:
view sourceprint?01 const double BuyBook::UNIT_PRICE = 8;
02 const double BuyBook::DISCOUNTS[5] = {1, 0.95, 0.9, 0.8, 0.75};
03 static const int BOOK_KINDS = 5;
04 double BuyBook::SearchFast(int* books)
05 {
06 Sort(books);
07 int g[5];
08 g[0] = books[0] - books[1];
09 g[1] = books[1] - books[2];
10 g[2] = books[2] - books[3];
11 g[3] = books[3] - books[4];
12 g[4] = books[4];
13 int t = min(g[2], g[4]);
14 if (t > 0)
15 {
16 g[2] -= t;
17 g[4] -= t;
18 g[3] += 2 * t;
19 }
20 double sum = 0;
21 for (int i = 0; i < BOOK_KINDS; ++i)
22 {
23 sum += g[i] * (i+1) * UNIT_PRICE * DISCOUNTS[i];
24 }
25 return sum;
26 }
发表评论
-
KMP快速字符串查找算法
2011-08-25 19:29 673在C/C++语言编程过程中,一般的字符串搜索操作都是通过标准库 ... -
求解最大公约数问题
2011-08-25 19:27 700最大公因数,又称最大公约数。是指 [n(≧2)个自然数 a1, ... -
堆排序(Heap Sort)算法学习
2011-08-25 19:26 1087在程序设计相关领域, ... -
整数拆分问题的动态规划解法
2011-08-25 19:26 3074输入n,和k,问将n用1到k这k个数字进行拆分,有多少种拆分方 ... -
背包问题介绍与分析
2011-08-25 19:24 1033背包问题是在1978年由Merkel和Hellman提出的。它 ... -
求平方根sqrt()函数的底层算法效率问题
2011-08-25 19:23 1293我们平时经常会有一些数据运算的操作,需要调用sqrt,exp, ... -
面试中常见的一些算法问题
2011-08-25 19:22 699Problem 1 : Is it a loop ? ( ... -
各种排序算法的C++实现与性能比较
2011-08-25 19:21 927排序是计算机算法中非常重要的一项,而排序算法又有不少实现方法, ... -
背包问题之硬币找零问题
2011-08-25 19:19 1177设有6 种不同面值的硬 ... -
求能被1到20的数整除的最小正整数
2011-08-25 19:18 1374求能被1到20的数整除的最小正整数。最直觉的方法是求1到20这 ... -
二叉树中的最近公共祖先问题
2011-08-25 19:16 1325题目:要求寻找二叉树中两个节点的最近的公共祖先,并将其返回。 ... -
判断一个整数是否是2的N次方
2011-08-25 19:04 1827题目:给定一个整数num,判断这个整数是否是2的N次方。比如, ... -
字符串逆序的算法汇总
2011-08-25 19:01 1061很早就准备写一个字符串系列的面试题,本来已经写好了,大概有十几 ... -
计算从1到N中1的出现次数
2011-08-25 18:59 602给定一个十进制整数N, ... -
KMP快速字符串查找算法
2011-08-25 18:57 967在C/C++语言编程过程中,一般的字符串搜索操作都是通过标准库 ... -
快速排序的递归实现
2011-08-25 18:54 761快速排序是对冒泡排序的一种改进。它的基本思想是:通过一次排序将 ... -
数字1亿里面有多少个1呢
2011-08-25 18:52 745乍看这题真够唬人的,群里看到这个题目后争先恐后的说看法。最简单 ... -
最大子序列、最长公共子串、最长公共子序列
2011-08-25 18:33 794最大子序列 最大子序列是要找出由数组成的一维数组中和最大的连续 ... -
一道关于男女比例的面试题
2011-08-25 16:56 1043阿里巴巴的一道面试题:说澳大利亚的父母喜欢女孩,如果生出来的第 ...
相关推荐
- 打折问题通常涉及原价、折扣率和折后价的计算。例如,购买书籍时,通过比较打八折和打九折的价格差异来计算原价。 综上所述,这些题目都涉及到了一元一次方程的应用,它们是初中数学的重要组成部分,旨在训练...
3. 分数和比例的应用:如题目中提到的买化肥和树苗的优惠活动,涉及到每单位价格和批量购买的折扣计算。 4. 容量和供应时间的计算:例如熊猫吃饲料的问题,需要判断饲料是否足够30天食用。 5. 工程问题:车间生产...
总的来说,小学四年级的奥数涵盖了基本的算术运算、应用题解法、几何概念、比例与分数、速度与时间、购物问题、平均数、组合优化以及数列规律的识别等多方面知识,旨在培养学生的数学思维能力和问题解决能力。
11. **书店购书优惠策略**:第16题涉及到打折策略,根据购书原价与折扣的关系,结合两次购书总金额,求解原价总和。 综上所述,这些题目涵盖了从一次方程的解、线性方程组的求解方法、实际问题与方程组的联系、利润...
这篇文档主要涵盖了解一元一次方程的基本...这些练习题涵盖了基础数学概念与实际问题相结合的应用,是学习和巩固一元一次方程解法的有效方式。通过这样的训练,学生能提高解题能力,同时理解数学在日常生活中的应用。
8. 打折问题:"买七送三"意味着顾客只需支付7个商品的费用即可获得10个商品,计算最优惠的折扣率。 9. 圆的周长与面积计算:利用圆的周长公式求半径,再用面积公式求面积。 10. 字母表达式与年龄问题:通过小明的...
10. **会员卡折扣问题**:第22题是实际应用问题,涉及计算成本和优惠策略的比较。买书是否合算取决于书的总价和会员卡的费用。 总结来说,这些题目覆盖了一元一次方程的基础理论和解法,包括移项、合并同类项、解...
这些知识点涵盖了小学六年级数学中的核心概念,包括百分数的运算、方程解法、简单的代数和几何问题,以及与日常生活紧密相关的利率、折扣和税率计算。通过这样的检测,可以评估学生对这些概念的理解和应用能力。
【一元二次方程应用】 一元二次方程在实际生活中有广泛的应用,例如解决面积、销售策略、工资增长、房价调整、建筑规划、商品定价等问题。...理解和熟练掌握一元二次方程的解法对于解决这些问题至关重要。
以上知识点涵盖了百分比、几何图形、比例与反比例、折扣计算、方向判断、工程问题、几何序列、圆的性质、方程解法、几何视图、比例问题、体积计算、方程求解、工程进度计算、方砖面积计算以及速度问题等多个数学概念...
以上是六年级数学下册1-5单元试题中涉及的主要知识点,涵盖了数的认识、数轴的理解、正负数、小数、分数、百分比、折扣、税率、方向与距离表示、存款利息计算、方程解法、简算以及实际问题的应用。这些知识点是小学...
- 计算题中,小明购买科幻书享受买3赠1的优惠,通过计算得知原价。 6. **代数与函数**: - 函数题目要求解满足特定条件的二次函数解析式,涉及到对称轴的概念以及等根的性质。 7. **应用题**: - 救灾物资的...
8. **利润和折扣问题**:商品打八折出售,利润率为10%,意味着售价是成本价的110%,再打折后仍保持10%的利润率。如果商品进价是1000元,原价可以通过设立方程求解。 9. **利息计算**:存款的利息计算涉及本金、利率...