首页 > 其他分享 >回溯过程中降重剪枝

回溯过程中降重剪枝

时间:2024-01-18 15:22:29浏览次数:28  
标签:剪枝 false target 中降 int vector candidates 回溯 visited


这题跟之前组合问题不同之处在于给的数组里面的元素是有重复的。
如果按照之前方法处理的话,就会得到重复的集合。
看了卡哥的方法,知道这个去重是是树层去重,横向的;不是树枝去重,纵向的。
这除了和前一个元素比较,还要加一个visit数组。如果前一个元素的visit是false就符合条件。
这个要记得在弹出元素的时候也有,将visit设置为false。

完整代码:

点击查看代码
class Solution {
public:
vector<int>v;
vector<vector<int>>cnt;
void backtracking(vector<int>& candidates, int target,int startflag,vector<bool>visited){
    int sum=0;
    int sz=v.size();
    for(int i=0;i<sz;i++){
        sum+=v[i];
    }
    if(sum>target){return ;}
    else if(sum==target){
    cnt.push_back(v);
        return ;
    }
    for(int i=startflag;i<candidates.size();i++){
        if(i>0&&candidates[i]==candidates[i-1]&&visited[i-1]==false){continue;}      
        v.push_back(candidates[i]);
        visited[i]=true;
        backtracking(candidates,target,i+1,visited);
        visited[i]=false;
        v.pop_back();
    }
}

    vector<vector<int>> combinationSum2(vector<int>&candidates, int target) {
        sort(candidates.begin(),candidates.end());
        vector<bool>visited(candidates.size(),false);
backtracking(candidates,target,0,visited);
return cnt;
    }
};

标签:剪枝,false,target,中降,int,vector,candidates,回溯,visited
From: https://www.cnblogs.com/yun-che/p/17972583

相关文章

  • 回溯初理解
    首先要明确一点回溯也是纯暴力的一种方法,就是多层for循环。但是有的题目你不能写出它具体有多少层for循环,因此用递归来表示内侧for循环的逻辑。比如说这道题,它for循环的数目是随着K变化的,K等于2是就两层for循环。卡哥给出回溯算法框架点击查看代码voidbacktracking(参数){......
  • 回溯 backtrack
    目录简介简介回溯算法是一种用于解决一些计算问题的通用算法,它会逐步构建候选解,并在确定候选解无法完成时放弃每个部分的候选解。回溯算法通常用于解决组合优化问题,如八皇后问题、0-1背包问题等。它使用递归的方式来尝试所有可能的解,并在搜索过程中进行剪枝,以提高效率。下面是......
  • 回溯过程浅理解
    如何知道这一题需要用回溯呢?回溯就像试触,如果不符合条件,就往回缩,但是这种缩,不是回到起点,而是回到上一步。所以题目像二叉树路径,这样需要不断的试触并且要记录之前的路径信息的,就要用到回溯。关于回溯如何用,有一些关键点。有递归就有回溯,单层递归中有加就有减,(这个加减要广义......
  • 代码随想录算法训练营第二十四天 | 回溯算法理论基础,77. 组合
    一、回溯算法理论基础学习:1.基本概念回溯法是一种搜索方式回溯的本质是穷举,是递归的副产品,即回溯算法就是递归算法回溯解决的问题都能理解成树形结构,一般是在集合中递归查找子集。集合的大小构成树的宽度(n叉树),递归的深度构成了树的深度2.回溯解决的问题(1)组合问题:N个......
  • 回溯法求解n个元素的集合的幂集
      过程:树中的根节点表示幂集元素的初始状态(为空集);叶子节点表示它的终结状态中幂集ρ(A)的8个元素;第i层(i=1,2,3,...,n)层的分支节点,则表示已对集合A中前i-1个元素进行了取/舍处理的当前状态(其中左分支表示“取”,右分支表示“舍”);将上述问题求解集合的幂集转换为先序遍历这棵......
  • 算法分析-回溯算法-求解N皇后问题
    一.题目需求n皇后问题是一道比较经典的算法题。它研究的是将n个皇后放置在一个n×n的棋盘上,使皇后彼此之间不相互攻击。即任意两个皇后都不能处于同一行、同一列或同一斜线上。二.算法思想1.构建棋盘可以用一个n×n列表来表示棋盘,设皇后所在的位置为board[i],i代表行,board[......
  • Alpha-Beta剪枝的原理的深入理解(无图预警)
    转载请注明原文链接:https://www.cnblogs.com/Multya/p/17929261.html考虑一个树:一棵树上只有叶子节点有值,有确定的根节点的位置根据层数来划分叶子节点和根节点之间的链接节点偶数层上的值取子节点的最大值,奇数取最小因为叶子节点上的值确定,在有这么个规则之后整棵树上所......
  • c语言回溯法实现01背包问题
    w[N],p[N]中直接装的是样例,可以修改数据,别忘记修改N。#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<stdlib.h>#defineN5//0-1背包,用三种算法实现//动态规划,贪心,回溯,分支限界voidOutput(intbestx[]);intConstraint(intt);floatBound(inti);voidB......
  • python回溯求解电话号码组合
    给定一个仅包含数字2-9的字符串,返回所有它能表示的字母组合。答案可以按任意顺序返回。给出数字到字母的映射如下(与电话按键相同)。注意1不对应任何字母。输入:digits="23"输出:["ad","ae","af","bd","be","bf","cd","ce","cf"]示例2:......
  • python回溯法n皇后问题
    classSolution:defsolveNQueens(self,n:int):defgenerateBoard():board=list()foriinrange(n):row[queens[i]]="Q"board.append("".join(row))......