leetcode子集和问题

Combination Sum

回溯法应用

数组不含重复元素,结果可含重复元素。回溯法。

自己写的代码:

class Solution {
public:
vector<vector<int>>v;
vector<int>v1;
int sum;
    vector<vector<int> > combinationSum(vector<int> &candidates, int target) {
        sort(candidates.begin(),candidates.end());
        v.clear();
        sum=0;
        backtrace(candidates,target,0);
        sort(v.begin(),v.end());
        return v;        
    }
    void backtrace(vector<int> &candidates, int target,int dep)
    {
        if(sum==target)
        {
            if(count(v.begin(),v.end(),v1)==0)v.push_back(v1);
        }
        if(dep==candidates.size())
        return;    
        if(dep<candidates.size())
        {
            int j=(target-sum)/candidates[dep];
            for(int i=0;i<j;i++)/可加入j次
            {      
                sum+=candidates[dep];
                v1.push_back(candidates[dep]);  
                backtrace(candidates,target,dep+1); 
            }
            for(int i=0;i<j;i++)
            {
                sum-=candidates[dep];
                v1.pop_back();          
            }
            backtrace(candidates,target,dep+1);//不包含此元素时 
        }
    }
};

 给出的集合里有重复元素,但每一个元素只能用一次

class Solution {
public:
vector<vector<int>>v;
vector<int>v1;
int sum;
    vector<vector<int> > combinationSum2(vector<int> &candidates, int target) {
        sort(candidates.begin(),candidates.end());
        v.clear();
        sum=0;
        backtrace(candidates,target,0);
        sort(v.begin(),v.end());
        return v;        
    }
    void backtrace(vector<int> &candidates, int target,int dep)
    {  
        if(sum==target)
        {
            if(count(v.begin(),v.end(),v1)==0)v.push_back(v1);
        }
        if(dep==candidates.size())
        return;    
        if(dep<candidates.size()&&sum<target)
        {
                sum+=candidates[dep];
                v1.push_back(candidates[dep]);  
                backtrace(candidates,target,dep+1); 
                sum-=candidates[dep];
                v1.pop_back();          
                backtrace(candidates,target,dep+1);
        }
    }
};

 

posted @ 2013-05-15 00:47  代码改变未来  阅读(277)  评论(0编辑  收藏  举报