深度优先搜索-组合问题

def com(arr, n, k, vis, cur):   # cur表示剩下可选的元素范围为cur~n
    if len(vis) == k:
        print(vis)
        return      # 剪枝1
    if n-cur + len(vis) < k:    # 剪枝2
        return
    for i in range(cur, n): # 关键点1,从剩下可选范围内增加元素
        vis.append(arr[i])
        com(arr, n, k, vis, i+1)    # 关键点2:为了保证顺序,当前选中元素左边的元素不再选了
        vis.remove(arr[i])


if __name__ == '__main__':
    arr = ['A', 'B', 'C', 'D', 'E']
    n = len(arr)
    k = 3
    vis = []
    cur = 0
    com(arr, n, k, vis, cur)

arr为候选元素数组

vis为当前以及选中的元素数组

cur表示接下来可以在cur~n范围内选择元素

关键点1:为了保证顺序,接下来选择范围必须是cur~n
关键点2:选择一个元素arr[i]之后,索引小于i(记为x)的元素不再选了,因为之前一定出现过先选x,再选arr[i]情况
剪枝1:可以没有。如果没有,那么会在构造解之后,继续向vis中添加元素,直到没有元素可添加后才结束这一层底层,这是没有必要的。
剪枝2:可以没有。如果没有,那么在 即使剩余所有元素都选择也不足以构成解 的情况下,依然会去尝试,这是没必要的

猜你喜欢

转载自blog.csdn.net/ten_sory/article/details/108470782