動態規劃 買票找零

2021-06-18 16:28:19 字數 1518 閱讀 5431

水題一道,但是感覺起來挺有意思的。

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

每張球票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元。

輸出格式

輸出:2n個人,可以找零的排隊方式數。

輸入樣例

輸出樣例

分析:一開始天真地以為可以直接用高中的排列組合公式算(想想發現忘光了t_t

),後來算了下才發覺不對勁。後面換了種想法。

q1:假設抽屜裡面沒有錢,那麼只能將乙個

50的排第一位。

q2:假設抽屜有

50元錢,那麼這次可以隨意排

50或者

100的在第一位。

問題可以抽象成,假設抽屜有money 

的錢,有

n1個人拿著

50元,

n2個人拿著

100元待排隊,求排隊的方式數。開始是 

money == 0, n1 == n2 == n。

很好的乙個遞迴模型了,自頂向下,採用備忘錄方法優化。

函式定義:

int getcount(int n1, int n2, int  money);

對於q1:

count = getcount(n1 - 1, n2, money + 50) ;

即抽屜沒錢,只能先排乙個50

的在前面

對於q2: 

count = getcount(n1 - 1, n2, money + 50) + getcount(n1, n2-1, money-50);

即抽屜有錢的話,排序總數量是兩種子問題的總和。

然後討論問題的遞迴出口。

由上面分析可以看出,最終出口肯定是 n1 

不斷減少,直到0, 

money

不斷增加,增加到跟

n2相等的情況。這種時候相當於,抽屜有 x 張

50元,剛好有 

x 個人拿著

100元過來買票。那麼很好理解,只有一種排隊方法。

**就不貼了。從來認為演算法的**沒有可讀性可言,看**不如看分析。

買票找零問題

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

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...

找零問題 動態規劃

當乙個幣值組合用貪婪演算法不能找出最優解的時候,比如對於 1,2,5 7,10。如果找14元錢的話,貪婪演算法答案是10,2,2,但最優解為7,7。那麼利用動態規劃就能找出最優解,只是時間和空間複雜度都很高,o nm 首先寫出狀態方程 f i 1,x 如果v i x 即當如果當前選擇的幣值大於找零的...