题目:组合总和

核心思路:每次添加元素之后都将target减少对应的值,直到等于或小于零

具体实现:

在回溯函数中首先判断target是否已经等于零——代表着当前元素的组合已经满足要求,可以压入res数组中

否则继续进行遍历与递归,直到出现满足总和要求的数组为止

在循环中要注意的是,当总和已经超出target时,就不要在把当前元素存入temp中了,而是直接跳过他,从下一个元素继续进行

 1void backTrack(vector<int>& candidates, int target, int index, vector<int>& temp, vector<vector<int>>& res)
 2{
 3    if(target == 0)
 4    {
 5        res.push_back(temp);
 6        return;
 7    }
 8
 9    for(int i = index; i < candidates.size(); i++)
10    {
11        if(target - candidates[i] < 0) continue;
12        temp.push_back(candidates[i]);
13        backTrack(candidates, target - candidates[i], i, temp, res);
14        temp.pop_back();
15    }
16}
17vector<vector<int>> combinationSum(vector<int>& candidates, int target)
18{
19    vector<vector<int>> res;
20    vector<int> temp;
21    res.reserve(150);
22    backTrack(candidates, target, 0, temp, res);
23    return res;
24}