2. 给定三个正整数m,n,s问从1到m这m个数里面取n个不同的数,使它们和是s,有多少种取法。python
时间: 2024-05-14 19:16:59 浏览: 124
解决方法如下:
```
def dfs(m, n, s, nums, res):
if n == 0 and s == 0:
res[0] += 1
elif n > 0 and s > 0:
for i in range(m, 0, -1):
if s >= nums[i]:
dfs(i-1, n-1, s-nums[i], nums, res)
def count_ways(m, n, s):
nums = [0] * (m+1)
res = [0]
for i in range(1, m+1):
nums[i] = nums[i-1] + i
dfs(m, n, s, nums, res)
return res[0]
```
这里使用一个dfs函数来搜索所有的取数方法。其中,m表示可以取的最大数,n表示还需要取多少个数,s表示还需要凑齐的和,nums数组表示前缀和,res数组用于记录取数方法的数量。
具体实现中,首先判断结束条件。如果n和s都为0,那么表示已经取到n个数,而且它们的和为s,这种取法是有效的,将res数组中的数量加1即可。如果n和s均大于0,那么可以枚举当前可以取的最大数i,只要当前的和s不小于i,就可以递归求解剩余的部分。需要注意的是,由于需要保证所选数字互不相同,因此每次递归时,从i-1开始枚举。
在主函数count_ways中,首先构造前缀和数组,然后调用dfs函数进行搜索,并返回res数组中的值。
阅读全文