Add up and the combination of the target value - Niuke.com

Insert picture description here

class Solution {
    
    
public:
    vector<vector<int>> res;
    
    /*
     * 判断某个值是否在search集合中
     */
    bool contains(vector<int> &search, int& n){
    
    
        for(int i=0;i<search.size();i++){
    
    
            if(search[i] == n){
    
    
                search.push_back(n);
                return true;
            } 
        }
        return false;
    }
    void getAns(vector<int> &num,vector<bool> &visited, vector<int> &path, int curSum, const int& target){
    
    
        if(curSum > target) return;
        if(curSum == target){
    
    
            res.push_back(path);
        } else {
    
    
            vector<int> search;
            for(int i=0;i<num.size();i++){
    
    
                if(!visited[i] && !contains(search, num[i]) &&(path.size()==0 || path[path.size()-1]<=num[i])){
    
    
                    // 剪枝
                    visited[i] = true; 
                    path.push_back(num[i]);
                    
                    getAns(num, visited, path, curSum + num[i], target);
                    
                    path.pop_back();
                    visited[i] = false;
                }
            }
        }
        
    }
    
    vector<vector<int> > combinationSum2(vector<int> &num, int target) {
    
    
        vector<bool> visited(num.size());
        vector<int> path;
        sort(num.begin(), num.end());
        getAns(num, visited, path, 0, target);
        return res;
    }
};

Guess you like

Origin blog.csdn.net/weixin_40315481/article/details/108658445