水題一道,但是感覺起來挺有意思的。
一場激烈足球賽即將開始,售票員緊張地賣票著……。
每張球票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 即當如果當前選擇的幣值大於找零的...