【39.组合总和】
这个题目和之前组合题目的不同点在于,组合内的元素是可以重复使用的。所以每一层遍历的时候,都是从第一个数开始遍历。递归的终止条件在于,如果sum大于target,直接return。如果sum等于target,那么可以把路径path加入result。
关于剪枝:
首先需要对组合进行排序,才可以剪枝。
for循环中的终止条件需要加一个。当当前遍历到的i加上sum之后小于等于target才可以继续for循环。如果大于target就需要剪枝。
所以整体的代码跟以往不一样的就是如下:
//for循环的剪枝
for(int i = startIndex; i < candidates.size()&& sum + candidates[i]<= target; i++){
//for循环中
backtracking(candidates, target, sum, i);
//主函数的递归函数之前排序
sort(candidates.begin(), candidates.end());// 需要排序