题目描述:
给定两个正整数N和S,你需要找出所有长度为N的正整数数列中,满足单调递增以及综合为S的数列有多少个。
输入描述:
共一行,两个整数N和S。(1<N, S<100000)
输出描述:
一个整数,为满足条件的数列个数对100000007取模的结果
示例1
输入
3 10
输出
4
说明
(1,2,7)
(1,3,6)
(1,4,5)
(2,3,5)
示例2
输入
2 5
输出
2
说明
(1,4)
(2,3)
我用的DFS加剪枝。不一定正确,也不一定通过。
N = 3
S = 10
# N = 2
# S = 5
result = 0
def dfs(now_count, now_len, index): # now_count表示现在已经选择的元素个数,now_len表示现在已经的选择的元素的和,index表示当前要处理的元素。
global result
print('now_count=', now_count, 'now_len=', now_len, 'index=', index)
if now_count == N or index >= S: # 终止条件
if now_len == S and now_count == N:
result += 1
print('√\n')
return
else:
print('X\n')
return
elif now_count < N and now_len > S: # 剪枝1:如果还没到N,选择的元素的和就已经超过S,则不用再继续遍历。
return
elif now_count < N and S - now_len < index: # 剪枝2:如果还没到N,剩下的元素都超过了需要的值,则不用再继续遍历。
return
else:
# (1)选择index这个元素
print('choose', index)
dfs(now_count+1, now_len+index, index + 1)
# (2)不选择index这个元素
print('not choose', index)
dfs(now_count, now_len, index + 1)
dfs(0, 0, 1)
print(result)