程式設計之美 買票找零

2021-09-30 14:50:17 字數 2413 閱讀 4219

一,問題:n個拿著1元,n個人拿著2元去買票。票價一元,且售票元只能用n個人購票的一元給2元的找零。問有幾種排列方法

分析:卡特蘭數方法

遞推公式:f(2*n) =f(0)*f(2(n-1)) +f(1)*f(2(n-2))+……+f(2(n-1))*f(0)

f(n) =f(0)*f(n-1) +f(1)*f(n-2)+……+f(n-1)*f(0)

解答:所有序列的個數 :c (2n,n) (ps:由於數學函式難打,這裡表示從2n個位置中挑選n個存放1)

非法序列的個數:假設有一種序列 n-1個1元,n+1個2元。這種序列個數:c (2n,n-1)

存在k使得這個序列中1的個數比2少1個,則將其後的所有1換成2,所有2換成1。則該序列有n個1,n個2。這樣這種序列(n-1個1,n+1個2)跟(n個1,n個2)一一對應。所以,非法序列個數為:c (2n,n-1)

所以合法序列個數:c (2n,n) - c (2n,n-1) =c (2n,n) /(n+1)

二,擴充套件問題:n個結點可以構造多少個不同的二叉樹

分析解答:

當n=1時,只有1個根節點,則只能組成1種形態的二叉樹,令n個節點可組成的二叉樹數量表示為h(n),則h(1)=1; h(0)=0;

當n=2時,1個根節點固定,還有2-1個節點。這乙個節點可以分成(1,0),(0,1)兩組。即左邊放1個,右邊放0個;或者左邊放0個,右邊放1個。即:h(2)=h(0)*h(1)+h(1)*h(0)=2,則能組成2種形態的二叉樹。

當n=3時,1個根節點固定,還有2個節點。這2個節點可以分成(2,0),(1,1),(0,2)3組。即h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=5,則能組成5種形態的二叉樹。

以此類推,當n>=2時,可組成的二叉樹數量為h(n)=h(0)*h(n-1)+h(1)*h(n-2)+...+h(n-1)*h(0)種,即符合catalan數的定義,可直接利用通項公式得出結果。

令h(1)=1,h(0)=1,catalan數(卡特蘭數)滿足遞迴式:

h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (其中n>=2)

另類遞迴式:

h(n)=((4*n-2)/(n+1))*h(n-1);

該遞推關係的解為:

h(n)=c(2n,n)/(n+1) (n=1,2,3,...)

擴充套件:卡特蘭數的應用  (實質上都是遞迴等式的應用)

1、括號化問題  矩陣鏈乘: p=a1×a2×a3×……×an,依據乘法結合律,不改變其順序,只用括號表示成對的乘積,試問有幾種括號化的方案?(h(n)種)

2、出棧次序問題  乙個棧(無窮大)的進棧序列為1,2,3,…,n,有多少個不同的出棧序列?

分析對於每乙個數來說,必須進棧一次、出棧一次。我們把進棧設為狀態『1』,出棧設為狀態『0』。n個數的所有狀態對應n個1和n個0組成的2n位二進位制數。由於等待入棧的運算元按照1‥n的順序排列、入棧的運算元b大於等於出棧的運算元a(a≤b),因此輸出序列的總數目=由左而右掃瞄由n個1和n個0組成的2n位二進位制數,1的累計數不小於0的累計數的方案種數。

在2n位二進位制數中填入n個1的方案數為c(2n,n),不填1的其餘n位自動填0。從中減去不符合要求(由左而右掃瞄,0的累計數大於1的累計數)的方案數即為所求。

不符合要求的數的特徵是由左而右掃瞄時,必然在某一奇數字2m+1位上首先出現m+1個0的累計數和m個1的累計數,此後的2(n-m)-1位上有n-m個 1和n-m-1個0。如若把後面這2(n-m)-1位上的0和1互換,使之成為n-m個0和n-m-1個1,結果得1個由n+1個0和n-1個1組成的2n位數,即乙個不合要求的數對應於乙個由n+1個0和n-1個1組成的排列。

反過來,任何乙個由n+1個0和n-1個1組成的2n位二進位制數,由於0的個數多2個,2n為偶數,故必在某乙個奇數字上出現0的累計數超過1的累計數。同樣在後面部分0和1互換,使之成為由n個0和n個1組成的2n位數,即n+1個0和n-1個1組成的2n位數必對應乙個不符合要求的數。

因而不合要求的2n位數與n+1個0,n-1個1組成的排列一一對應。

顯然,不符合要求的方案數為c(2n,n+1)。由此得出 輸出序列的總數目=c(2n,n)-c(2n,n+1)=1/(n+1)*c(2n,n)。

(這個公式的下標是從h(0)=1開始的)

類似問題

有2n個人排成一行進入劇場。入場費5元。其中只有n個人有一張5元鈔票,另外n人只有10元鈔票,劇院無其它鈔票,問有多少中方法使得只要有10元的人買票,售票處就有5元的鈔票找零?(將持5元者到達視作將5元入棧,持10元者到達視作使棧中某5元出棧)

3、凸多邊形的三角剖分問題  求將乙個凸多邊形區域分成三角形區域的方法數。

類似:一位大城市的律師在她住所以北n個街區和以東n個街區處工作。每天她走2n個街區去上班。如果她從不穿越(但可以碰到)從家到辦公室的對角線,那麼有多少條可能的道路?

類似:在圓上選擇2n個點,將這些點成對連線起來使得所得到的n條線段不相交的方法數?

程式設計之美 買票找零 卡特蘭數

第一次看這題的時候沒有好好注意,後來發現這是一類大問題,學習了卡特蘭數這個概念,順便又複習了高中的排列組合知識 先看一下書中引入卡特蘭數的例子 程式設計之美 4.3買票找零 2n個人排隊買票,其中n個人持50元,n個人持100元。每張票50元,且一人只買一張票。初始時售票處沒有零錢找零。請問這2n個...

買票找零問題

問題描述 一場激烈足球賽即將開始,售票員緊張地賣票著 每張球票50元,現在有2n 1 n 18 個球迷排隊購票,其中n個手持50元鈔票,另外n個手持100元鈔票。假設開始售票時售票處沒有零錢可以找零。問這2n個人有多少種排隊方式,不至使售票處出現找不出零的局面?例如當n 3時,共6人,3人持50元,...

動態規劃 買票找零

水題一道,但是感覺起來挺有意思的。一場激烈足球賽即將開始,售票員緊張地賣票著 每張球票50 元,現在有2n 1 n 18 個球迷排隊購票,其中 n個手持 50元鈔票,另外 n個手持 100元鈔票。假設開始售票時售票處沒有零錢可以找零。問這2n 個人有多少種排隊方式,不至使售票處出現找不出零的局面?例...