void backtracking(int *sum,int **returnColumnSizes,int target,int **result,int *returnSize,int *length,int* temp,int index,int *candidates,int candidatesSize){
//sum用于每轮保存当轮数字组合的和,result是最终主函数要返回的指针数组,每个指针指向一个符合要求的数字组合
//temp用于每轮保存当轮数字组合,length是temp中数字的数量,也作为下标,指向最后一个元素的下一位
//index是每轮开始在candidates中选出数字的下标,其他为题目给的参数
if((*returnSize)>=150)//题目要求组合数少于150个
return;
if((*sum)>target)
return;
else if((*sum)==target){//当前数组的数字和等于target,则收割结果
result[*returnSize]=(int *)malloc(sizeof(int)*(*length));//在指针数组的指针内创建空间
for(int i=0;i<(*length);i++){//将要收割的数字组合存进刚创建的空间内
result[*returnSize][i]=temp[i];
}
(*returnColumnSizes)[*returnSize]=(*length);
(*returnSize)++;
return;
}
else{
for(int i=index;i<candidatesSize;i++){
temp[(*length)++]=candidates[i];
(*sum)+=candidates[i];
backtracking(sum,returnColumnSizes,target,result,returnSize,length,temp,i,candidates,candidatesSize);
(*length)--;
(*sum)-=temp[*length];
}
}
}
int** combinationSum(int* candidates, int candidatesSize, int target, int* returnSize, int** returnColumnSizes){
int **result=(int **)malloc(sizeof(int *)*150);
(*returnColumnSizes)=(int* )malloc(sizeof(int)*150);
int *temp=(int *)malloc(sizeof(int)*21);
(*returnSize)=0;
int sum=0;
int length=0;
backtracking(&sum,returnColumnSizes,target,result,returnSize,&length,temp,0,candidates,candidatesSize);
return result;
}