游戏之乐买书问题算法设计与分析.pdfVIP

  • 0
  • 0
  • 约7.65千字
  • 约 10页
  • 2026-02-05 发布于北京
  • 举报

游戏之乐_1.4_买书问题

问题描述

上柜的《哈利波特》平装本系列,一共有五卷。假设每一卷单独销售均需8欧元。如

果读者一次不同的两卷,就可以扣除5%的费用,三卷则。假设具体折

扣的情况如下:

本数2折扣5%

本数3折扣10%

本数4折扣20%

本数5折扣25%

问题:设计出算法,能够计算出读者所的一批书的格。

总体分析

优化问题可以用:动态规划、贪心算法、分支限界等方法。本题

中,可以选择动态规划和改进的贪心算法进行求解,但是首选动态规

划。

解决方案1:动态规划

动态规划要注意两点:状态转移方程和边界条件。

状态转移方程就是递归,也就是过程中的状态,动态规划是

自顶向下层层递归(即,把大的问题转化成更小一点的问题),然后自

底向上层次解答。

边界条件就是最终一个个循环的条件。

代码见源码1所示,程序为c++代码,很容易c实现,其中要注意:

◼每次都要排序,这样才能保证程序更简洁,即讨论的边界条件每

次都是那几个if。

◼前后循环都有关联(不是单纯的使每一次花最少钱,而是保证总共

花最少钱),相当于是枚举了所有的情况,然后找一个花最少钱的

情况。

贪心算法

贪心算法思想就是每次都选择最大的,以此类推。但是这样的前

提是本次选择不会对后面的选择有任何影响。

在本题中,如果用基本的贪心算法,那么是每次选择折扣最大的,但

是根据表1可以看出,当本数为8的时候,不能选择5+3,而要选

择4+4才能折扣最大,这样就存在了特例,也就是说基本的贪心算法

行不通。

表1折扣计算表

那么我们就要从另外的思路来思考了。

参考:

所以我们的目标最终还是应该定为寻找如何“贪”!实际目标应该

定为限制本次选择对于此后选择的影响,或使本次选择的影响仅限于

下一次选择,这也是表格只需要计算到的(两次选择最多

选择本书)。但由于下一次选择的影响可能会影响下下次的选择,

所以我们不能硬性将这些选择拆开然后再相加,而只能一次一次地完

成选择。

➢那么修改后的贪心算法的规则是:

◼本次选择的书的数量不应该小于下一次可选择的书的最大数量。

◼整个选择输出的最先需要进行一次边界判断,确定需要输出的

个数

◼每次选择后需要重新排序。

◼每一次选择之前都应该查表,选择其中使得近两次折扣数最大的

那个作为本次选择(因为我们使得本次选择的影响被控制在两次

选择的范围内)。

以上的规则是根据本题的限定条件给出的,如果限定条件改变,

那么规则也要进行一些改变,需要修改的主要是第二条。限定条件有:

(只有种书、本的组合里面只有一个特例)

举个例子:

代码如源码中所示:

实际代码中不止是只有开头才进行边界判断,只要就得判

断一次。

而且这个改进的贪心算法的时间性能比动态规划好很多,书的本

数越多动态规划越吃力,贪心算法则会好很多。

源码:

定义一个最大值,相当于取最小值时忽略这

个位置的值

冒泡排序

返回最

小值

dou

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档