首页 > 其他分享 >回溯-子集型

回溯-子集型

时间:2024-07-12 18:08:13浏览次数:4  
标签:return nums 回溯 dfs 子集 ans path def

参考:回溯算法套路①子集型回溯【基础算法精讲 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

 

标签:return,nums,回溯,dfs,子集,ans,path,def
From: https://www.cnblogs.com/r1-12king/p/18299143

相关文章

  • Day65 代码随想录打卡|回溯算法篇---组合总和II
    题目(leecodeT40):给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。candidates 中的每个数字在每个组合中只能使用 一次 。注意:解集不能包含重复的组合。 方法:本题的要求是每个元素在组合中只能......
  • 回溯算法-以学生就业管理系统为例
    1.回溯算法介绍1.来源回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。用回溯算法解决问题的一般步骤:1、针对所给问题,定义问题的解空间,它至少包含问题的一个(最优)解。2、确定易于搜索的解空间结构,使得能用回溯法方便地搜索整个解空间。3、以深度优先的方式搜索......
  • 回溯大合集+主元素+DFS图
    子集和问题importjava.util.Scanner;​publicclassMain{  staticintn;//元素个数  staticinttarsum;//目标和  staticintremainSum=0;//当前元素加到最后一个元素的总和,剩余元素和  staticintsesum=0;//已选元素之和  static......
  • P7224 [RC-04] 子集积 (背包 dp + 复杂度优化)
    P7224[RC-04]子集积背包dp+复杂度优化考虑dp。容易想到背包dp,设\(f_{i,j}\)表示考虑了前\(i\)个,当前乘积为\(j\)的方案数。枚举\(a_i\)的倍数转移。复杂度\(O(\sum\limits_{i=1}^n\frac{m}{a_i})\)。如果\(a_i\)互不相同,那么近似于\(O(m\lnm)\)。如果还想......
  • leetcode77组合——经典回溯算法
    本文主要讲解组合的要点与细节,以及回溯算法的解题步骤,按照步骤思考更方便理解 c++和java代码如下,末尾给定两个整数 n 和 k,返回范围 [1,n] 中所有可能的 k 个数的组合。你可以按 任何顺序 返回答案。 具体要点:1.首先,这道题的暴力解法是k层for循环,遍历所有的......
  • 回溯算法套路①子集型回溯 - 灵神视频总结
    我回来了,前两天模型出了问题,忙于工作。加上回溯有点想不清楚,查了查资料。汗颜。这节课主要讲回溯的基本概念和回溯的基本套路。首先各位思考一个问题:如果生成一个长度为2的字符串,该怎么操作?我们通常的想法是用两层循环拼接就好,如果用两层循环,如果我要生成长为2或者3......
  • 第二十六天 第七章 回溯算法 part04 491.递增子序列 46.全排列 47.全排列 II
    491.递增子序列将其看作一个二叉树,可以知道,在二叉树每层中,不能取相同的元素。这题最主要要理解这个点。使用unordered_set对其进行降重。classSolution{public:vector<vector<int>>res;vector<int>cur;voidbacktracking(vector<int>&nums,intindex){......
  • 如何在不能求逆的时候做子集卷积 exp(即便能求逆也比常见方法优雅)
    为什么要求逆?正常做子集卷积exp的时候递推求\(G=\exp(F)\)的系数时要用。什么情况下不能求逆?模\(2^{64}\),或者压根不取模。我们可能会想,算出来肯定除得尽啊,因为组合意义上是不会出现分数的。并非如此,例如我们可能会尝试算\(\exp(x)\cdot\exp(2x)\)的\([x^3]\)处的系......
  • Day61 代码随想录打卡|回溯算法篇---组合优化
    本篇是针对上一题的优化,因为在计算所有可能的组合结果时,不是每一条路径都是我们需要遍历的,如图,当n和k都为4的时候,其实最终的结果只有一个[1,2,3,4]是符合结果的。因此我们遍历的时候就不需要遍历每一条边,而是只需要沿着1,2,3,4的路径直接下来即可。那么我们怎么控制循环变量使得......
  • leetcode-19-回溯-组合问题(剪枝、去重)
    引自代码随想录一、[77]组合给定两个整数n和k,返回1...n中所有可能的k个数的组合。示例:输入:n=4,k=2输出:[[2,4],[3,4],[2,3],[1,2],[1,3],[1,4]]1、大致逻辑 k为树的深度,到叶子节点的路径即为一个结果开始索引保证不重复取数(从当前位置往后......