队伍选择
使用Python2.7.3
题目描述:现有n个人,要从这n个人中选任意数量的人组成一只队伍,再在这些人中选出一名队长,求不同的方案对
取模的结果。如果两个方案选取的人的集合不同或选出的队长不同,则认为这两个方案是不同。
输入描述:
一行一个数字n。
输出描述:
一行一个数字表示答案
示例1
输入
2
输出
4
说明
4种方案为 , , , ,其中 表示选取 为队长。
思路:
n=1,f(1) = 1
n=2,f(2) =
*f(1) + 2
n=3,f(3) =
*f(1) +
*f(2) + 3
……
其中
=
在计算f(n)时,可以明显看到是需要利用到1-n的结果,因此很自然的想到利用递归的方法计算。如果空间复杂度要求不高,还可以将前面的结果都保存下来,这样可以减少计算量。这里的代码是最简单的直接递归版本。
代码
# -*- coding:utf-8 -*-
class Solution:
def NumOfSquad(self, n):
if n < 1 or n > 10**9:
return 0
if n == 1:
return 1
sum = n
for i in range(1,n):
sum += self.NumOfChoose(n,i) * self.NumOfSquad(i)
return sum%(10**9+7)
def NumOfChoose(self, n, x):
if x == 1:
return n
return int(self.factorial(n)/self.factorial(n-x)/self.factorial(x))
def factorial(self, n):
if n == 1:
return 1
res = 1
for i in range(1,n+1):
res *= i
return res
if __name__ == "__main__":
num = 5
solution = Solution()
print(solution.NumOfSquad(num))
以空间换时间和题目2待更新……