《程式設計之美》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)為例,
也就是說,因為有著書分為不同的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種情況