leetcode39

思路如下:

1、遍历数组中的每一个数字。
2、递归枚举每一个数字可以选多少次,递归过程中维护一个target变量。如果当前数字小于等于target,我们就将其加入我们的路径数组path中,相应的target减去当前数字的值。也就是说,每选一个分支,就减去所选分支的值。
3、当target == 0时,表示该选择方案是合法的,记录该方案,将其加入res数组中。

作者:lin-shen-shi-jian-lu-k
链接:https://leetcode-cn.com/problems/combination-sum/solution/hui-su-suan-fa-zui-tong-su-yi-dong-de-da-6qyl/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
leetcode39

class Solution {
public:

    vector<vector<int>>res; //记录答案
    vector<int>path;   //记录路径

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        dfs(candidates,0,target);
        return res;
    }

    void dfs(vector<int>&c,int u ,int target)
    {
        if(target < 0) return ;   //递归边界
        if(target == 0)
        {
            res.push_back(path);  //记录答案
            return ;
        }
        for(int i = u; i < c.size(); i++){
            if( c[i] <= target)  
            {
                path.push_back(c[i]);   //加入路径数组中
                dfs(c,i,target -  c[i]);// 因为可以重复使用,所以还是i
                path.pop_back();        //回溯,恢复现场
            }
        }
    }
};