買票找零問題

2021-06-18 21:15:25 字數 1286 閱讀 6552

問題描述:

一場激烈足球賽即將開始,售票員緊張地賣票著……。

每張球票50元,現在有2n(1<=n<=18)個球迷排隊購票,其中n個手持50元鈔票,另外n個手持100元鈔票。假設開始售票時售票處沒有零錢可以找零。

問這2n個人有多少種排隊方式,不至使售票處出現找不出零的局面?

例如當n=3時,共6人,3人持50元,3人持100元。可以找零的排隊方式有如下5種:

50 50 50 100 100 100

50 50 100 100 50 100

50 50 100 50 100 100

50 100 50 50 100 100

50 100 50 100 50 100

輸入格式:

輸入:輸入n,表示2n個球迷,其中n個手持50元,另外n個手持100元。(n<=18)
輸出格式:
輸出:這2n個人可以找零的排隊方式數。

分析(動態規劃):

首先,2n肯定就是偶數(這是當然啦),而且第乙個必須是50元。

假設第乙個50元和第k 個100元匹配(找零),第2個到第k-1個、第k+1個到第2n個也是可以實現找零的。

其中,k-1-2+1、2n-(k+1)+1也必須是偶數,即k為偶數。

假設,2n的排列個數為 f(2n) ,k=2i ( 1<= i <= n );

則排列個數 f(2n)=sum ( 1<= i <= n ),其中f(0)=1;

至此,遞迴公式就出來了。

可以看出,上面的遞迴計算中存在子問題的重複計算問題,這就是符合動態規劃的方法了。

這裡我們採用一中動態規劃的變形-----備忘錄方法。該方法的控制結構和遞迴一樣(從頂向下),區別只是在遞迴過程中儲存每個求解過的子問題,建立備忘錄以備遇到重複問題時檢視,避免相同子問題的重複求解。

**如下:

#includeusing namespace std;

int a[50];

int func(int n)

return a[n];

}int abc (int n)

int main(){

int n;

cin>>n;

abc(2*n);

cout<

4 3 買票找零問題

answer res c n c fracc n 先介紹卡特蘭數 給出乙個n,要求乙個長度為2n的0,1序列,使得序列的任意字首中1的個數不少於0的個數 證明 考慮乙個含有n個1,n個0的2n位二進位制數字,掃瞄到第2m 1位上的時候有m 1個0和m個1,則後面0,1 的個數分別為 有n m個1和n...

動態規劃 買票找零

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

程式設計之美 買票找零

一,問題 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 ...