Given a set of candidate numbers (C) and a target number (T), find all unique combinations inC where the candidate numbers sums to T.
The same repeated number may be chosen from C unlimited number of times.
Note:
- All numbers (including target) will be positive integers.
- The solution set must not contain duplicate combinations.
For example, given candidate set [2, 3, 6, 7]
and target 7
,
A solution set is:
[ [7], [2, 2, 3] ]
给出数组和目标数,从数组中取出若干个数使得他们的和等于目标数(能重复取),求出所有满足上面条件的数组的集合。用dfs可破之。
代码:
class Solution
{
public:
vector<vector<int> > combinationSum(vector<int>& candidate,int target)
{
if(candidate.empty()) return res;
sort(candidate.begin(),candidate.end());
auto endp=unique(candidate.begin(),candidate.end());
candidate.erase(endp,candidate.end());
n=candidate.size();
vector<int>path;
dfs(candidate,target,0,0,path);
return res;
}
private:
vector<vector<int> >res;
int n;
void dfs(vector<int>&candidate,int target,int cur,int sum,vector<int>path)
{
if(sum==target)
{
res.push_back(path);
return;
}
if(cur==n)
{
return;
}
if(sum>target)
{
return;
}
dfs(candidate,target,cur+1,sum,path);
for(int i=1;;i++)
{
sum+=candidate[cur];
if(sum>target) return;
path.push_back(candidate[cur]);
dfs(candidate,target,cur+1,sum,path);
}
}
};