1. 思路
这个题目其实也是标准的dfs,由于每个数可以重复选择,所以每次选择都是从数组的第一个选到最后一个。
我看题解有人用dp再做,其实dp在这个题目上并不讨巧。
原因是要记录1~target的所有组合,空间开销一定大。当target很大的时候,时间复杂度也很大。
2.代码
class Solution {
public:
vector<vector<int>> combinationSum(vector<int>& candidates, int target) {
vector<vector<int>> ret;
vector<int> temp;
dfs(ret, 0, 0, 0, temp, candidates, target);
return ret;
}
void dfs(vector<vector<int>>& ret, int sum, int pos,
int start, vector<int>& temp, vector<int>& candidates, int target)
{
if(sum == target)
{
temp.resize(pos);
ret.push_back(temp);
return;
}
temp.resize(pos + 1);
for(int i = start; i < candidates.size(); ++i)
{
if(sum + candidates[i] > target)
continue;
temp[pos] = candidates[i];
dfs(ret, sum + candidates[i], pos + 1, i, temp, candidates, target);
}
}
};