未名湖边的烦恼
- 问题描述
- 输入格式
- 样例输入
- 输出格式
- 样例输出
- 解题思路
- 代码实现
问题描述
每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋,可是人太多了,每天下午收工后,常常一双冰鞋都不剩。
每天早上,租鞋窗口都会排起长龙,假设有还鞋的m个,有需要租鞋的n个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种排法)
输入格式
两个整数,表示m和n
样例输入
3 2
输出格式
一个整数,表示队伍的排法的方案数。
样例输出
5
解题思路
求方案数这一问题使用递归来处理是非常清晰的,递归是搜索组合的一种非常直观的思路。
要避免出现体育组没有冰鞋可租的尴尬场面,就要让还鞋的人比租鞋的人多,或者人数一样,如果发现租鞋的人比还鞋的人多,这时是没有可行的排队方案的。
- 接下来,回想一下排列组合问题,要把2个人的队伍和3个人的队伍合并,怎么排?
这时可以把问题简化,可以先让2人队伍中的一人排到新队伍中,这时就变成了把1个人的队伍和3个人的队伍合并的问题;当然,也可以让3人队伍中的一人排到新队伍中,这时就变成了把2个人的队伍和2个人的队伍合并的问题。
用代码实现就是这样:
def count(self, m, n):
if n > m: # 租鞋的人比还鞋的人多
return 0
elif n == 0: # 没有租鞋的人
return 1
else:
return self.count(m-1, n) + self.count(m, n-1)
整理一下,得到完整代码。
代码实现
class WeimingLake(object):
# Troubles by Weiming Lake
def __init__(self):
lists = list(map(int,input().split()))
self.m, self.n = lists[0], lists[1]
self.result = self.count(self.m, self.n)
print(self.result)
def count(self, m, n):
if n > m: # 租鞋的人比还鞋的人多
return 0
elif n == 0: # 没有租鞋的人
return 1
else:
return self.count(m-1, n) + self.count(m, n-1)
weimingLake = WeimingLake()