《编程之美》1.4买书问题的简化版本

优秀书籍

原题:

某出版社的《哈里波特》系列共有5卷,每本单卖都是8块钱,如果读者一次购买不同的k(k>=2)卷,就可以享受不同的折扣优惠,如下所示:

《《编程之美》1.4买书问题的简化版本》

求,如果买一批书的最低价格,即最大折扣


简化版本:

将“不同的k卷”这个条件去掉。

表面上这样就变成了几乎不相关的一个题目,实际上并不是这样。

2个题目的思路其实还是差不多,这一点,可以从把正整数n表示成若干个正整数的和,求积的最大值把正整数n表示成若干个不同的正整数的和,求积的最大值这2个题目的相似性看出来。

这个简化的版本,正是原题的铺垫。


问题重述:

有n本书,可以将n拆开成若干部分,每一部分都是1-5本,对于每一部分,如果不止1本就可以享受上图中的折扣,现在要求总折扣的最大值。


名词定义:

(1,2)表示一个部分是1本书,另外一个部分是2本书,(3)表示一个部分是3本书,以此类推。

(1,2)<(3)表示(1,2)的折扣小于(3)(下面还有稍微详细一些的介绍)

注:(1,2)的折扣为1*0+2*5%=10%,(3)的折扣为3*10%=30%

n1,n2,n3,n4,n5:ni表示一个部分里面的书的个数为i的这样的部分的个数

注:如果将n拆开成6个部分,大小分别为1,1,3,4,4,5(n=1+1+3+4+4+5=18)

么n1=2,n2=0,n3=1,n4=2,n5=1


问题求解:

(其实问题已经转化成了单纯形的问题,不过这里我并不准备讨论这个,因为这对原题毫无帮助)

首先,列出下列10个容易得到的条件:

(1,1)<(2)

(1,2)<(3)

(1,3)<(4)

(1,4)<(5)

(2,2)<(4)

(2,3)<(5)

(2,4)<(1,5)

(3,3)<(1,5)

(3,4)<(2,5)

还有一个特殊的,(3,5)<(4,4)(这个也是书上一直在讨论的,阻碍贪心的地方)

再解释一下含义:例如(3,4)<(2,5)表示的是,

如果3本书按照3本书的折扣10%计算,另外4本书按照20%的折扣计算,总折扣是3*10%+4*20%=110%,但是如果2本书按照2本书的折扣5%计算,另外5本书按照25%计算,总折扣是2*5%+5*25%=135%,

因为110%<135%,所以将7本书拆开成(3,4)不如拆开成(2,5)


然后,根据上述的10个条件,依次可以得到:

n1<=1

n1*n2=0

n1*n3=0

n1*n4=0

n2<=1

n2*n3=0

n2*n4=0

n3<=1

n3*n4=0

n3*n5=0

解释第一条结论n1<=1:如果有2个部分都只有1本书,不如将这2个部分合并为1个部分,所以最多只有1个部分是只有1本书的

解释第二条结论n1*n2=0:如果有n1和n2都不为0,将1个大小为1的部分和1个大小为2的部分合并为1个大小为3的部分,总折扣会变大。所以n1和n2至少有1个为0

后面的以此类推。


下面根据这10个等式和不等式,进行化简:

一,根据前4个结论

n1<=1

n1*n2=0

n1*n3=0

n1*n4=0

结果可以分成2大类,第一类是n=1+n5*5,即1个部分有1本书,n5个部分有5本书

第二类是n=n2*2+n3*3+n4*4+n5*5,含义同上。


二,对第二类继续分类

n2*n3=0

n3<=1

n3*n4=0

n3*n5=0

根据这4个结论,第二类又可以分成2类

第1类是n3=1,那么n2=0,n4=0,n5=0,所以n=3

第2类是n3=0,那么n=n2*2+n4*4+n5*5


三,对第2类继续分类

n2<=1

n2*n4=0

根据这2个条件,第2类又可以分成2种情况

第1种是n2=1,n4=0,那么n=2+n5*5

第2种是n2=0,那么n=n4*4+n5*5


四,对第2种情况继续分类

注意到,10个条件对应的10个结论都已经用完了,这里再补充一个条件和结论:

(4,4,4)<(5,5,2)所以n4<3

所以第2种情况可以分成3种:n4=0,n4=1,n4=2


综上所述,一共有6种情况:

n=1+n5*5

n=3

n=2+n5*5

n=5+n5*5

n=4+n5*5

n=4+4+n5*5

其中n5都是非负整数。

除了n=3之外,另外5种情况的n,n%5都互不相同

可以看出来,这6种情况互不交叉,且刚好划分整个正整数集

对于任意正整数n,如果n=3,那么就不需要拆分,如果n不是3,那么根据n%5的值,就可以在除了n=3之外的另外5种情况中找到对应的一种。

下面说明为什么这样就是最优解:

首先,根据上面的一系列推理,n的拆分只能是这6种情况,所以必定是6种情况中的某一种。

然后,这6种情况是互不交叉的,所以n是哪一种情况是唯一确定的。

最后,因为每种情况中,除了n5之外都是可以确定的,所以n的拆分也就唯一确定了。

例如,123本书,123%5=3,那么123=4+4+23*5就是最优拆分。

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