编程之美1.4 买书问题

     在节假日的时候,书店一般都会做促销活动。由于《哈利波特》系列相当畅销,店长决定通过促销活动来回馈读者。在销售的《哈利波特》平装本系列中,一共有五卷,用编号 0, 1, 2, 3, 4 来表示。假设每一卷单独销售均需要 8 欧元。 如果读者一次购买不同的两卷,就可以扣除 5% 的费用,三卷则更多。
     在一份订单中,根据购买的卷数以及本书,就会出现可以应用不同折扣规则的情况。但是,一本书只会应用一个折扣规则。比如,读者一共买了两本卷一,一本卷二。那么,可以享受到 5% 的折扣。另外一本卷一则不能享受折扣。如果有多种折扣,希望能够计算出的总额尽可能的低。
     要求根据这样的需求,设计出算法,能够计算出读者所购买一批书的最低价格。

问题分析:
     首先考虑贪心法,贪心法毕竟比较高效。贪心法要求具有贪心选择性,这个问题里不是很明确,因为这个跟折扣的数目是有关系的。因此可以考虑一种边界情况,来考察是否具有贪心选择性。我举个例子,一共8本数,每种书本数分别为2,2,2,1,1,这样的情况下,贪心策略的方法是5+3,另一种可行方案是4+4。经过计算发现,贪心策略的总价高于了4+4的方案,因此不满足贪心选择性。这类问题是否满足贪心选择性事实上和具体的题目数据有关,假如折扣的差距更大一点,那么可能就会满足了,需要具体看。
     这样的话考虑动态规划。动态规划需要重叠性的子问题才能提高效率。如何划分子问题呢,由于折扣是每次购买给一次折扣,那么这个状态的确定就要根据每次购买的操作来确定。考虑到每本书价格相同,并且折扣时不关心是哪几本书,简化问题起见把要购买的书的组合X1,X2,X3,X4,X5规定为从大到小排序。递推关系可以这样描述,每一次购买的操作可以选择购买1-5本书(假如可以的话),然后再对剩下的书进行相同的操作,取最大值。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值