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:
- All numbers (including target) will be positive integers.
- Elements in a combination (a1, a2, � , ak) must be in non-descending order. (ie, a1 ? a2 ? � ? ak).
- 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]
vector<vector<int> > combinationSum(vector<int> &arr, int target)
{
vector<vector<int> > ans;
int size = arr.size();
if (size == 0)
return ans;
sort(arr.begin(), arr.end());
vector<pair<int, vector<int> > > vec;
int *indexArr = new int[size];
for (int i = 0; i < size; ++i)
{
indexArr[i] = i;
vector<int> tmp;
tmp.push_back(arr[i]);
if (arr[i] == target)
{
ans.push_back(tmp);
}
else
{
vec.push_back(make_pair(arr[i], tmp));
}
}
int end = vec.size();
int index = 0;
while (index < vec.size())
{
for (int i = 0; i < size; ++i)
{
int curNum = arr[i];
int from = indexArr[i];
indexArr[i] = vec.size();
// 如果是最后一个,就到第0个
int to = end;
for (int j = from; j < to; ++j)
{
int sum = vec[j].first;
++index;
vector<int> tmp = vec[j].second;
if (sum + curNum <= target)
{
tmp.push_back(curNum);
if (sum + curNum == target)
{
sort(tmp.begin(), tmp.end());
ans.push_back(tmp);
}
else
{
vec.push_back(make_pair(sum + curNum, tmp));
}
}
}
}
index = end;
end = vec.size();
}
return ans;
}