問題描述:
每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。輸入格式:每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排法,可以避免出現體育組沒有冰鞋可租的尷尬場面。(兩個同樣需求的人(比如都是租鞋或都是還鞋)交換位置是同一種排法)
兩個整數,表示m和n輸出格式:
乙個整數,表示隊伍的排法的方案數。樣例輸入:
3 2樣例輸出: 資料規模和約定:
m,n∈[0,18]
## 問題分析 m人還鞋,n人租鞋
(1)當m < n 的時候,不管怎麼排都會出現 有人借不到鞋的尷尬場面,所以這時候方案數為 0
(2)當n = 0 的時候由於題目不需要區分同樣需求的人交換位序的情況,所以只有一種方案,這時候方案為1
(3)當m > n 的時候,每一種可行方案肯定是以還鞋的人在第乙個開頭(如果以租鞋開頭一定會出現借不到鞋,因為本來租鞋視窗沒有鞋),以還鞋或者是租鞋結尾(廢話,一共有兩種情況)
這樣我們可以把每一種方案分為兩類:最後為還鞋或最後為租鞋
這樣我們就確定了每一種最後一位同學是還鞋還是租鞋,就不需要考慮最後一位是租鞋還是還鞋了。
同理利用遞迴也可以確定倒數第二位是租鞋或者還鞋的方案數
例:m=5 n=3 (一共8個同學)
總方案數 = 最後是還鞋的方案數 + 最後是租鞋的方案數
最後一位是還鞋 這時候 m = 4 n = 3 (這時候就不用考慮最後一位同學,因為他一定是還鞋,只需要討論前七位同學是租鞋還是還鞋)
最後一位是租鞋 這時候 m = 5 n = 2 (確定最後一位是租鞋,只需要討論前七位同學)
然後遞迴……………………
## **如下:
m,n =
map(
int,
input()
.split()
) #輸入
def fun
(m, n)
: #遞迴
if m < n:
return
0if n ==0:
return
1return
fun(m-
1, n)
+fun
(m, n-1)
#fun(m-1,n)是確定最後一位為還鞋的方案數
#fun(m,n-1)是確定最後一位為租鞋的方案數
print
(fun
(m, n)
) #輸出
在網上搜尋發現這個題沒有很詳細的解釋,想了一種比較容易明白的解釋 未名湖邊的煩惱
問題描述 每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排法,可以避免出現體育組沒有冰鞋可租的尷尬場面。兩個同樣需求的人 比如都是租鞋...
未名湖邊的煩惱
問題描述 每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排法,可以避免出現體育組沒有冰鞋可租的尷尬場面。兩個同樣需求的人 比如都是租鞋...
未名湖邊的煩惱
問題描述 每年冬天,北大未名湖上都是滑冰的好地方。北大體育組準備了許多冰鞋,可是人太多了,每天下午收工後,常常一雙冰鞋都不剩。每天早上,租鞋視窗都會排起長龍,假設有還鞋的m個,有需要租鞋的n個。現在的問題是,這些人有多少種排法,可以避免出現體育組沒有冰鞋可租的尷尬場面。兩個同樣需求的人 比如都是租鞋...