1. 程式人生 > >《程式設計之美》1.4買書問題的常數時間解法

《程式設計之美》1.4買書問題的常數時間解法

優秀書籍

某出版社的《哈里波特》系列共有5卷,每本單賣都是8塊錢,如果讀者一次購買不同的k(k>=2)卷,就可以享受不同的折扣優惠,如下所示:


求,如果買一批書的最低價格,即最大折扣

符號說明:

按照書上的記法,假設Y1>=Y2>=Y3>=Y4>=Y5>=0,n=Y1+Y2+Y3+Y4+Y5

假設a,b,c,d,e分別是5本書的名字,僅僅是名字,不是變數

用【ab】表示1個部分有2本書,是a和b,這2本書享受2本書的5%的折扣,用【acde】表示1個部分有4本書等等以此類推

雖然這11個結論對本題已經不成立了,但是這11個條件卻還成立,但是敘述上得改一下。

(4,4,4)<(5,5,2)為例,

原本的敘述是,如果可以拆分成4+4+4,那麼自然也可以拆分成5+5+2,這樣折扣就變大了。但是這裡的敘述是,如果可以拆分成4+4+4,而且也可以拆分成5+5+2,那麼5+5+2的折扣就大一些。

也就是說,因為有著書分為不同的5卷這個限制,可以拆分成4+4+4的12本書不一定可以拆分成5+5+2。

定理一,所有的大小為1的部分可以表示成若干個(若干個可能是0個,下同)【a】

證明:因為(1,1)<(2)所以【a】和【b】不共存,否則可以用【ab】代替

定理二,所有的大小為2的部分可以表示成若干個【ab】和若干個【ac】

證明:因為(2,2)<(4)所以【ab】和【cd】不能共存

因為(2,2,2)<(3,3)所以【ab】【bc】【ac】不能共存,否則可以用【abc】和【abc】這2個部分代替

因為(2,2,2)(1,1,4)所以【ab】【ac】【ad】不能共存,否則可以用【a】【a】【abcd】這3個部分代替

綜合這3個限制即可得到定理二

定理三,所有的大小為3的部分可以表示成若干個【abc】

證明:因為(3,3)<(2,4),所以【abc】和【abd】不能共存,否則可以用【abcd】和【ab】這2個部分代替

而且【abc】和【ade】不能共存,否則可以用【abcd】和【ae】這2個部分代替

所以2個不一樣的大小為3的部分是不能共存的

定理四,所有的大小為4的部分可以表示成若干個【abcd】若干個【abce】

證明:因為(4,4,4)<(2,5,5)所以abcd】【abce】【abde】不能共存,否則可以用【abcde】和【abcde】和【ab】這3個部分代替

所以3個不一樣的大小為4的部分是不能共存的

定理五,n本書可以表示成若干個【a】和若干個【ab】和若干個【ac】和若干個【abc】和若干個【abcd】若干個【abce】和若干個【abcde】

證明:首先根據定理四可得,大小為4或5的部分可以表示成若干個【abcd】若干個【abce】和若干個【abcde】

注意:定理三隻是說2個不一樣的大小為3的部分是不能共存的,在沒有限制條件下可以不妨設都是【abc】,但是在現在已經表示出大小為4或5的部分之後,就不能這樣不妨設了,還需要別的條件才行。

因為(3,4)<(2,5),所以如果2個部分分別有3本書和4本書,那麼這4本書一定包含這3本書,例如【abc】和【abcd】

注意,這裡不能根據【abcd】和【abce】求交集得到大小為3的部分只能是【abc】,因為【abcd】和【abce】都可能不存在,還可能都不存在。但是,無論【abcd】是否存在,也無論【abce】是否存在,都可以不妨設大小為3的部分都是【abc】

因為(2,3)<(1,4),所以如果2個部分分別有2本書和3本書,那麼這3本書一定包含這2本書,例如【ab】和【abd】

因為(2,4)<(1,5),所以如果2個部分分別有2本書和4本書,那麼這4本書一定包含這2本書,例如【ab】和【abde】

同上,根據定理二,無論【abcd】是否存在,也無論【abce】是否存在,也無論【abc】是否存在,都可以不妨設所有的大小為2的部分可以表示成若干個【ab】和若干個【ac】

同理,因為(1,2)<(3),(1,3)<(4),(1,4)<(5),所以根據定理一,無論【abcd】是否存在,也無論【abce】是否存在,也無論【abc】是否存在,也無論【ab】是否存在也無論【ac】是否存在,都可以不妨設所有的大小為1的部分可以表示成若干個【a】

綜上可得定理五

下面根據定理五求解n可能表示成哪幾種情況

因為(1,3)<(2,2),所以2個部分分別有1本書和3本書是不可能的,即n1*n3=0

因為(3,5)<(4,4),所以2個部分分別有3本書和5本書是不可能的,即n3*n5=0

因為(2,2,5)<(1,4,4),所以【ab】和【ac】和【abcde】不能共存,否則可以用【a】【abcd】【abce】這3個部分代替

第1種情況,n3!=0

那麼n1=0,n5=0,n本書是若干個【ab】和若干個【ac】和至少1個【abc】和若干個【abcd】和若干個【abce】

第2種情況,n3=0且n5!=0

那麼【ab】和【ac】不能共存,不妨設【ac】不存在

那麼n本書是若干個【a】和若干個【ab】和若干個【abcd】和若干個【abce】和至少1個【abcde】

第3種情況,n3=0且n5=0

那麼n本書是若干個【a】和若干個【ab】和若干個【ac】和若干個【abcd】和若干個【abce】

下面討論根據Y1>=Y2>=Y3>=Y4>=Y5>=0,如何求出n的準確表示

首先,如何區分這3種情況?

第1種情況中,c的數量大於d和e的數量之和,a和d和e的數量之和小於b和c的數量之和

第2種情況中,c的數量小於d和e的數量之和

第3種情況中,c的數量大於或等於d和e的數量之和,a和d和e的數量之和大於或等於b和c的數量之和

這樣就區分開了3種情況。

現在的問題是abcde和Y1Y2Y3Y4Y5如何對應?

神奇的是,不妨設a對應Y1,b對應Y2,c對應Y3,d對應Y4,e對應Y5

於是得到下列結論:

第1種情況是Y1-Y3個【ab】Y1-Y2個【ac】Y2+Y3-Y1-Y4-Y5>0個【abc】和Y4個【abcd】和Y5個【abce】

第2種情況是Y1-Y2個【a】和Y2-Y3個【ab】和Y3-Y5個【abcd】和Y3-Y4個【abce】和Y4+Y5-Y3>0個【abcde】

第3種情況是Y1+Y4+Y5-Y2-Y3個【a】和Y2-Y4-Y5個【ab】和Y3-Y4-Y5個【ac】和Y4個【abcd】和Y5個【abce】

如果Y4+Y5-Y3>0就是第2種情況,否則的話

如果Y2+Y3-Y1-Y4-Y5>0就是第1種情況,否則就是第3種情況