编程之美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本书(假如可以的话),然后再对剩下的书进行相同的操作,取最大值。

    原文作者:jarelzhou
    原文地址: https://blog.csdn.net/jarelzhou/article/details/19204759
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞