zoukankan      html  css  js  c++  java
  • 【C++、回溯】LeetCode39. 组合总和

    1. 组合总和

    给定一个无重复元素的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。

    candidates 中的数字可以无限制重复被选取。

    说明:

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

    示例 1:

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

    示例 2:

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

    代码实现:

    class Solution {
    public:
        vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
            vector<vector<int>> results;
            vector<int> solution;
            backtracking(candidates,target,0,solution,results);
            return results;
        }
    
        void backtracking(vector<int> &candidates,int target,int start,vector<int>&solution,vector<vector<int>>&results){
            if(target<0){//总和已经超出目标值(每添加一个新的目标,把它的值从总和中减去)
                return;
            }
            if(target==0){//总和刚好等于目标值
                results.push_back(solution);//把当前的子集添加到结果中
                return;
            }
            for(int i=start;i<candidates.size();++i){//继续尝试把元素添加到当前的子集中
                solution.push_back(candidates[i]);//添加了一个新的元素到方法子集中
                backtracking(candidates,target-candidates[i],i,solution,results);//立即调用回溯函数看看是否找到了合适的子集
                solution.pop_back();//递归完毕后,要把上次尝试的元素从子集里删除
            }
        }
    };
    

    另一个版本的代码实现:

    class Solution {
    public:
        vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
            vector<vector<int>> res;
            vector<int> tmp;
            combinationSumCore(res,candidates,target,tmp,0,0);
            return res;
        }
    
        void combinationSumCore(vector<vector<int>> &res,vector<int>& candidates,int target,vector<int>&tmp,int sum,int begin){
            if(sum==target){
                res.push_back(tmp);
            }else{
                for(int i=begin;i<candidates.size();++i){
                    if(sum+candidates[i]<=target){
                        tmp.push_back(candidates[i]);
                        combinationSumCore(res,candidates,target,tmp,sum+candidates[i],i);
                        tmp.pop_back();
                    }
                }
            }
        }
    };
    

    疑点:
    为何最后要弹出最新尝试的那个值?

  • 相关阅读:
    数学函数,字符串函数,聚合函数
    javascript大神修炼记(7)——OOP思想(多态)
    Join的表顺序
    java web 基础
    LVS入门
    Eclipse 一直提示 loading descriptor for 的解决方法
    nginx的配置总结
    nginx入门(安装,启动,关闭,信号量控制)
    如何正大光明的使用 google 进行搜索
    npm报错Error: ENOENT, stat 'D:NodeLearn ode-global'
  • 原文地址:https://www.cnblogs.com/dindin1995/p/13059099.html
Copyright © 2011-2022 走看看