2019-08-12 拼多多笔试 第三题

题目描述:
给定两个正整数N和S,你需要找出所有长度为N的正整数数列中,满足单调递增以及综合为S的数列有多少个。
输入描述:

共一行,两个整数N和S。(1

输出描述:

一个整数,为满足条件的数列个数对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)

你可能感兴趣的:(2019-08-12 拼多多笔试 第三题)