【DFS + 回溯】39. 组合总和 40. 组合总和 II 216. 组合总和 III

  1. 组合总和
class Solution {
public:
    void dfs(vector<int>& candidates, vector<int> &cur, int index, int sum){
        if(sum == target)
            result.push_back(cur);
        else{
            for(int i=index;i<cand_len;++i){
                if(sum + candidates[i] > target)
                    break;
                else{
                    cur.push_back(candidates[i]);
                    dfs(candidates, cur, i, sum + candidates[i]);
                    cur.pop_back();
                }
            }
        }
    }

    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        this->target = target;
        sort(candidates.begin(), candidates.end());
        cand_len = candidates.size();
        vector<int> cur_num;
        dfs(candidates, cur_num, 0, 0);
        return result;
    }
private:
    int target;
    int cand_len;
    vector<vector<int>> result;
};

40. 组合总和 II
给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。
candidates 中的每个数字在每个组合中只能使用一次。

class Solution {
public:
    void dfs(vector<int>& candidates, vector<bool> &record, vector<int> &cur, int index, int sum){
        if(sum == target)
            result.push_back(cur);
        else{
            for(int i=index;i<cand_len;++i){
                if(sum + candidates[i] > target)
                    break;
                else if(i == index || candidates[i] != candidates[i-1]){   // 去重
                    cur.push_back(candidates[i]);
                    dfs(candidates, record, cur, i + 1, sum + candidates[i]);
                    cur.pop_back();
                }
            }
        }
    }

    vector<vector<int>> combinationSum2(vector<int>& candidates, int target) {
        this->target = target;
        sort(candidates.begin(), candidates.end());
        cand_len = candidates.size();
        vector<int> cur_num;
        vector<bool> record(cand_len, false);
        dfs(candidates, record, cur_num, 0, 0);
        return result;
    }
private:
    int target;
    int cand_len;
    vector<vector<int>> result;
};

216. 组合总和 III

class Solution {
public:
    void dfs(vector<int>& candidates, vector<int> &cur, int index, int sum){
        if(cur.size() == target_len && sum == target)
            result.push_back(cur);
        else if(cur.size() >= target_len || sum >= target)
            return; 
        else{
            int num_len = cur.size(); 
            for(int i=index;i<cand_len - (target_len - num_len) + 1;++i){
                if(sum + candidates[i] > target)
                    break;
                else{
                    cur.push_back(candidates[i]);
                    dfs(candidates, cur, i + 1, sum + candidates[i]);
                    cur.pop_back();
                }
            }
        }
    }

    vector<vector<int>> combinationSum3(int k, int n) {
        vector<int> candidates{1,2,3,4,5,6,7,8,9};
        target = n;
        target_len = k;
        cand_len = 9;
        vector<int> cur_num;
        dfs(candidates, cur_num, 0, 0);
        return result;
    }
private:
    int target;
    int cand_len;
    int target_len;
    vector<vector<int>> result;
};
posted @ 2022-03-01 16:41  fwx  阅读(28)  评论(0)    收藏  举报