题目描述
将整数 n 分成 k 份,且每份不能为空,任意两份不能相同(不考虑顺序)。
例如:n=7,k=3,下面三种分法被认为是相同的。
1,1,5 1,5,1 5,1,1
问有多少种不同的分法。
输入描述
输入一行,2 个整数n,k (6<n<200,2≤k<6)
输出描述
输出一个整数,即不同的分法。
示例
输入
7 3
输出
4
n,k = map(int,input().split())
#递推写法
dp = [[0] * (k+1) for i in range(n+1)]
for i in range(1,n+1):
dp[i][1] = 1 #表示n被分成1份时,只有1种分法
for i in range(2,n+1):
for j in range(2,k+1):
if i>=j:
#不选1,每份都分得1的分法 + 选1,其中1份是1的分法
dp[i][j] = dp[i-j][j]+dp[i-1][j-1]
print(dp[n][k])
#回溯写法:超时一个案例
def dfs(k,n):
if k == 0 or n == 0 or n < k:
memo[key] = 0
return 0
if n == k or k == 1:
return 1
else:
return dfs(k,n-k) + dfs(k-1,n-1)
print(dfs(k,n))