Given a set of candidate numbers (C) and a target number (T), find all unique combinations in C where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
For example, given candidate set 2,3,6,7 and
 target 7, 
A solution set is: 
[7] 
[2, 2, 3] 
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
         vector<vector<int>> res;
        if(candidates.size()==0) return res;
        if(target<=0) return res;
        int len=candidates.size();
        sort(candidates.begin(),candidates.end());
		stack<vector<int>> st;
		for(int i=candidates.size()-1;i>=0;i--)
		{
			vector<int>temp;
			temp.push_back(candidates[i]);
			if(accumulate(temp.begin() , temp.end() , 0)==target)
				res.push_back(temp);
			else if(accumulate(temp.begin() , temp.end() , 0)<target)
			st.push(temp);
			else
				;
		}
		
		while(!st.empty())//用迭代的方法深度遍历,用栈实现,栈内元素为路径各节点值。
		{
			vector<int> node=st.top();
			st.pop();
			int pre=accumulate(node.begin() , node.end() , 0);
			for(int i=candidates.size()-1;i>=0;i--)
		   {
			vector<int> temp=node;
			temp.push_back(candidates[i]);
			if(accumulate(temp.begin() , temp.end() , 0)==target)
			{
				sort(temp.begin(),temp.end());
				int flag=0;
				for(int j=0;j<res.size();j++)//判断res中是否已经加入该路径
				{
					if(res[j].size()==temp.size())
					{
						int t;
						for(t=0;t<temp.size();t++)
				        {
							if(res[j][t]!=temp[t])
							{
								break;
							}
						}
						if(t==temp.size())
						{
							flag=1;//已有相同的并加入到了res
						}
					}
				}
				if(flag==0)
				res.push_back(temp);
			}
			else if(accumulate(temp.begin() , temp.end() , 0)<target)
			st.push(temp);
			else
				;
		   }
		}
		return res;
        
    }方法一优点:简单直观,缺点:代码略长,并且在leetcode中会判断超时,但是在VS下运行超时的用例可以得到结果且正确。<pre name="code" class="cpp">class Solution {
public:
vector<vector<int>> res;
 vector<int> pre;
 void cm(vector<int>& p, int tag,int l)
 {
	 if(l==pre.size())
		 return;
	 int temp=accumulate(p.begin() , p.end() , 0);
	 if(temp==tag)
	 {
		 res.push_back(p);
		 return ;
	 }
	 else if(temp>tag)
		 return;
	 else
	 {
		 for(int i=l;i!=pre.size();i++)//因为candidates的元素可以重复使用,所以i=l
		 {
			 p.push_back(pre[i]);
			 cm(p,tag,i);
			 p.pop_back();
		 }
	 }
 }
    vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
        if(candidates.size()==0) return res;
         if(target<=0) return res;
         int len=candidates.size();
		 sort(candidates.begin(),candidates.end());
		 pre=candidates;
		 vector<int> tmp;//tmp为所要求的子集
		 cm(tmp,target,0);
		 return res;
    }
};
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文:http://blog.csdn.net/sinat_24520925/article/details/47058935