class Solution {
private:
vector<vector<int>> res;
vector<int> path;
int Sum(vector<int> path) {
int sum = 0;
for (int i = 0; i < path.size(); i++) {
sum += path[i];
}
return sum;
}
void backTracking(vector<int>& c, int t, int index) {
if (Sum(path) == t) {
res.push_back(path);
return;
}
if (Sum(path) > t) {
return;
}
for (int i = index; i < c.size(); i++) {
path.push_back(c[i]);
backTracking(c, t, i);
path.pop_back();
}
}
public:
vector<vector<int>> combinationSum(vector<int>& c, int t) {
backTracking(c, t, 0);
return res;
}
};
算法思想:因为可以出现相同的数字,但是不能出现相同的组合,所以可以定义一个index,来确保不会出现相同的组合。那如何保证可以出现相同的数字呢,就是每次递归的时候,也就是调用backTracking函数的时候index不变,for循环遍历的集合起始元素不变。
取了一个数,它的子树中可以去这个数,和这个数后面的数,而不能用这个数前面的数。