回溯-子集型

参考:回溯算法套路①子集型回溯【基础算法精讲 14】

ps:0-1背包也是一种子集型回溯

 

 注意:递归参数中的 i 不是第 i 个, 而是下标大于等于 i 的这部分

 

例题:

 

class Solution:     
    def f1(self, nums):
        n = len(nums)
        if n==0:
            return []
        
        ans = []
        path = []

        def dfs(i):
            if i == n:
                ans.append(path[:])
                return 
            dfs(i+1)
            path.append(nums[i])
            dfs(i+1)
            path.pop()
        
        dfs(0)
        return ans

 

方法二:

 

 

ps:这里的 i 指的是枚举的起点

class Solution:
    def subsets(self, nums: List[int]) -> List[List[int]]:
        return self.f2(nums)
        

    def f2(self, nums):
        n = len(nums)
        
        ans = []
        path = []

        def dfs(i):
            ans.append(path[:])

            for j in range(i, n):
                path.append(nums[j])
                dfs(j+1)
                path.pop()
        dfs(0)
        return ans

 

posted @ 2024-07-12 18:04  r1-12king  阅读(1)  评论(0编辑  收藏  举报