编程之美 set 11 买书问题

题目

书店搞促销, 同时购买多卷书时, 有机会享受优惠

2本优惠 5%, 3本 10%, 4 本 20% 5 本 25%

设计算法, 求解购买一本书的最低价格

分析

1. 第一个感觉是一次购买的越多省钱越多, 即贪心的思想, 但这样的思路对不对呢? 考虑下面一个案例

购买两本卷一, 两本卷二, 两本卷三, 一本卷四卷五

假如按照贪心的思路去求解, 共会花费 51.6 元, 而假如四本四本的买, 仅需 51.2 元, 所以贪心法不一定总是最优解

2. 动规解法

F(x1, x2, x3, x4, x5) 表示购买 x1 本卷一, x2... 所需的最少钱数

稍加分析, 可以得出, F(x2, x1, x3, x4, x5) 和上式是等价的, 所以, 我们可以简单的设为 F(Y1, Y2, Y3, Y4, Y5) 其中 Y1>= Y2, Y2>=Y3 etc

动态规划的状态转移方程就可以写成

F(Y1,Y2,Y3,Y4,Y5) = max( F(Y1-1,Y2-1,Y3-1,Y4-1,Y5-1) if y5 >= 1,

                      F(Y1-1,Y2-1,........Y4-1, Y5) if y4 >=1, etc }

写成上面的原因是启发性质的, 因为我们要优先使用卷数较多的书, 尽量使卷数的种类多.

这种解法的时间复杂度是 O(Y1*Y2...Y5), 空间复杂度为 O(Y1*Y2...Y5). 并且, 每次求完 Y1-1, Y2... 还需要重新排序, 时间复杂度较高

3. 书上提供了另一种贪心策略, 但没有严格证明, 没看. 

原文地址:https://www.cnblogs.com/xinsheng/p/3570314.html