题目大意:给出一个数组,用这些数组里的元素去凑一个target。元素可以重复取用。

 

感觉对这种题目还是生疏的。脑子里有想法,但是不知道怎么表达出来。

先记录下自己的递归法。应该还可以用循环实现。

 

回溯:罗列出所有的不重复的可能组合,每次判断:如果超出,放弃。如果不够,继续添加元素。如果刚好,存起来。

 

比如:a = [2 3 6 7]  target = 7

第一次,分成以下几个树去继续分叉:    2  3  6  7

第二次:

2 2  2 3  2 6  2 7  

3 3  3 6  3 7  

6 6  6 7   

7  满足了,直接存起来。

第三次继续分叉

 

class Solution {
public:
    // a 是给出的可选数组,start表示当前分支只能从start开始取数。last表示已经取的一些数。needed表示还差多少。
void back_track(vector<int>& a ,int start,vector<int>last, int needed) { if(needed == 0) ans.push_back(last);  //刚好满足,就存起来 if(needed < 0) return;    //数组都是正数。
      //加入下一个合法数,继续流程
for(int i = start;i < a.size();i++) { vector<int> tmp(last); tmp.push_back(a[i]); back_track(a,i,tmp,needed - a[i]); } } vector<vector<int>> combinationSum(vector<int>& candidates, int target) { for(int i = 0; i < candidates.size(); i++) { vector<int> vec; vec.push_back(candidates[i]);  //放入一个数,启动回溯 back_track(candidates,i,vec,target - candidates[i]); } return ans; } private: vector<vector<int>> ans; };

 

posted on 2017-12-07 12:36  newbird2017  阅读(163)  评论(0编辑  收藏  举报