[LeetCode] Combination Sum 回溯

Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.

The same repeated number may be chosen from C unlimited number of times.

Note:

  • All numbers (including target) will be positive integers.
  • Elements in a combination (a1, a2, … , ak) must be in non-descending order. (ie, a1 ≤ a2 ≤ … ≤ ak).
  • The solution set must not contain duplicate combinations.

For example, given candidate set 2,3,6,7 and target 7
A solution set is: 
[7] 
[2, 2, 3] 

Hide Tags
 Array Backtracking
 
 
   一道回溯题目,可以剪枝提升速度。
 
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

class Solution {
public:
    vector<vector<int > > ret;
    vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
        vector<int > stk;
        ret.clear();
        vector<int > tmp(candidates.begin(),candidates.end());
        sort(tmp.begin(),tmp.end());
        helpFun(tmp,target,0,stk);
        return ret;
    }

    void helpFun(vector<int> & cand,int tar, int idx,vector<int > & stk)
    {
        if(tar<0)   return ;
        if(tar==0){
            ret.push_back(stk);
            return ;
        }
        if(idx==cand.size())    return;
        stk.push_back(cand[idx]);
        helpFun(cand,tar-cand[idx],idx,stk);
        stk.pop_back();
        helpFun(cand,tar,idx+1,stk);
    }
};

int main()
{
    vector<int > cand = {8,7,4,3};
    Solution sol;
    vector<vector<int > > ret=sol.combinationSum(cand,11);
    for(int i =0;i<ret.size();i++){
        for(int j=0;j<ret[i].size();j++)
            cout<<ret[i][j]<<" ";
        cout<<endl;
    }
    return 0;
}
原文地址:https://www.cnblogs.com/Azhu/p/4391404.html