C语言
void dfs(int *nums, int numsSize, int *cs, int sum, int ***ret, int *returnSize, int **colSize, int curi) {
int i;
if (sum < 0) {
return;
}
if (sum == 0) {
int tcs = 0;
int tail = 0;
int j;
int ci = 0;
for (i = 0; i < numsSize; i++) {
tcs += cs[i];
}
(*returnSize)++;
tail = (*returnSize) - 1;
*ret = realloc(*ret, (*returnSize) * (sizeof(int *)));
*colSize = realloc(*colSize, (*returnSize) * sizeof(int));
(*ret)[tail] = calloc(tcs, sizeof(int));
(*colSize)[tail] = tcs;
for (i = 0; i < numsSize; i++) {
for (j = 0; j < cs[i]; j++) {
(*ret)[tail][ci] = nums[i];
ci++;
}
}
return;
}
for (i = 0; i < numsSize; i++) {
if (i < curi)
continue;
cs[i]++;
dfs(nums, numsSize, cs, sum - nums[i], ret, returnSize, colSize, i);
cs[i]--;
}
return;
}
int** combinationSum(int* nums, int numsSize, int target, int* returnSize, int** returnColumnSizes) {
int **ret = NULL;
int *cs = NULL;
*returnSize = 0;
ret = calloc(0, sizeof(int *));
*returnColumnSizes = calloc(0, sizeof(int));
cs = calloc(numsSize, sizeof(int));
dfs(nums, numsSize, cs, target, &ret, returnSize, returnColumnSizes, 0);
return ret;
}
注意点
- 回溯结束后记得把增加了的计数减1;
- 注意去掉重复项,如果每次都是全遍历,举个例子,如同用例1:会出现【2,2,3】【2,3,2】【3,2,2】会满足递归条件,所以本人在题解中加入了curi来控制重复情况;
结果

题目
