未名湖边的烦恼
问题描述
每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
输入格式
两个整数,表示m和n
输出格式
一个整数,表示队伍的排法的方案数。
样例输入
3 2
样例输出
5
思路
- 深搜,使用数组记录已经找过的状态,减少重复计算,要不然跑不出来
- 还鞋的必须比借鞋的多才行
代码
m, n = map(int, input().split(' '))
record = [[-1]*(n+1) for _ in range(m+1)]
def dfs(a, b): # 还鞋、借鞋
if a == b == 0:
return 1
if record[a][b] != -1:
ans = record[a][b]
else:
ans = 0
if a > 0:
ans += dfs(a-1, b)
if 0 < b <= a:
ans += dfs(a, b-1)
record[a][b] = ans
return ans
print(dfs(m, n))