力扣 39. 组合总和

77 阅读1分钟

🔗 leetcode.cn/problems/co…

题目

  • 给一个无重复元素的数组,给一个目标整数 target
  • 返回由数组中数字组合而成的 list,其总和为 target,返回所有可能性,数组中的元素可以重复使用

思路

  • 递归枚举所有的可能性
  • 递归退出的条件是,当前所选元素的 sum 总和为 target,或者超过 target,或者枚举完所有元素
  • 枚举每个元素时,同样枚举其可以出现的次数,从 0 到 target/candidates[index] 次,回溯时,把这若干次移除

代码

class Solution {
public:
    void dfs(vector<int>& candidates, int target, int index, int sum, vector<vector<int>>& ans, vector<int>& tmp) {
        if (sum > target) return;
        if (sum == target) {
            ans.push_back(tmp);
            return;
        }
        if (index >= candidates.size()) return;

        dfs(candidates, target, index + 1, sum, ans, tmp);
        int size = target / candidates[index];
        for (int i = 1; i <= size; i++) {
            tmp.push_back(candidates[index]);
            dfs(candidates, target, index + 1, sum + candidates[index] * i, ans, tmp);
        }
        while (size--) {
            tmp.pop_back();
        }
    }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        vector<vector<int>> ans;
        vector<int> tmp;
        dfs(candidates, target,0,  0, ans, tmp);
        return ans;
        
    }
};