20210419-组合总和

Posted 茴薏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了20210419-组合总和相关的知识,希望对你有一定的参考价值。

给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的数字可以无限制重复被选取。
说明:

所有数字(包括 target)都是正整数。
解集不能包含重复的组合。
示例 1:

输入:candidates = [2,3,6,7], target = 7,
所求解集为:
[
[7],
[2,2,3]
]

解题思路
欢迎大家关注,我会持续更新刷题题解,希望对大家有所帮助!

此题考查的是回溯算法内容里的组合总和问题。

重点概况:
·如果解决一个问题有多个步骤,每一个步骤有多种方法,题目又要我们找出所有的方法,可以使用回溯算法;
·回溯算法是在一棵树上的 深度优先遍历(因为要找所有的解,所以需要遍历);

剪枝操作:
1.在递归终止的地方剪枝,也就是if(sum > targetSum)进行剪枝操作
2.在for循环的搜索范围上,也就是sum + candidates[i] 已经大于target,就可以结束本轮for循环。

class Solution 
public:
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) 
        sort(candidates.begin(), candidates.end());
        backtracking(candidates, target, 0, 0);
        
        return result;
    
    
    void backtracking(vector<int>& candidates, int target, int sum, int startIndex)
    
        if(sum > target)
        
            return;
        
        
        if(sum == target)
        
            result.push_back(path);
            return;
        
        
        for(int i = startIndex; (i < candidates.size()) && (sum + candidates[i] <= target); ++i)
        
            sum += candidates[i];
            path.push_back(candidates[i]);
            backtracking(candidates, target, sum, i);
            sum -= candidates[i];
            path.pop_back();
        
    
private:
    vector<int> path;
    vector<vector<int>> result;
;

以上是关于20210419-组合总和的主要内容,如果未能解决你的问题,请参考以下文章

代码随想录|day26|回溯算法part03● 39. 组合总和● 40.组合总和II● 131.分割回文串

使用 R 获取总和为 100 的所有组合

创建 2、3 或 4 列的每个唯一组合的总和

组合总和-Leetcode

组合总和-Leetcode

递归与回溯7:LeetCode40. 组合总和 II(不可重复)