找出k个数相加得n的所有组合

Find all possible combinations of k positive numbers that add up to a number n,each combination should be a unique set of numbers.

 1 /**
 2  * Return an array of arrays of size *returnSize.
 3  * The sizes of the arrays are returned as *columnSizes array.
 4  * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
 5  */
 6 #define SIZE 600
 7 int** function(int k, int n, int** columnSizes, int* returnSize) {
 8     int **ret=(int**)malloc(sizeof(int*)*SIZE);
 9     int *sum=(int*)calloc(SIZE,sizeof(int));
10     int *countArray=(int*)calloc(SIZE,sizeof(int));
11     int temp_n=n;
12     int count=0;
13     int temp=1;
14     int temp_k=0;
15     int back=0;
16     *returnSize=0;
17     if(k==1){
18         *returnSize=1;
19         columnSizes[0]=(int*)malloc(sizeof(int));
20         columnSizes[0][0]=1;
21         ret[0]=(int*)malloc(sizeof(int));
22         ret[0][0]=n;
23         return ret;
24     }
25     for(int i=0;i<SIZE;i++){
26         ret[i]=(int*)calloc(k,sizeof(int));
27     }
28     while(temp*k+(k-1)*k/2<=n){
29         ret[(*returnSize)][0]=temp;
30         countArray[(*returnSize)]++;
31        sum[(*returnSize)]=temp;
32         temp++;
33         (*returnSize)++;
34     }
35     while(ret[count][0]!=0){
36         temp=ret[count][countArray[count]-1]+1;
37         temp_k=k-countArray[count];
38         while(temp*temp_k+(temp_k-1)*temp_k/2<=(n- sum[count])){
39             if(temp_k==1){
40                 ret[count][countArray[count]]=n- sum[count];
41                 break;
42             }
43             ret[count][countArray[count]]=temp;
44             back=sum[count];
45             sum[count]=sum[count]+temp;
46             countArray[count]++;
47             temp++;
48             while(temp*temp_k+(temp_k-1)*temp_k/2<=(n- sum[count])){
49                 for(int i=0;i<countArray[count]-1;i++){
50                     ret[(*returnSize)][i]=ret[count][i];
51                 }
52                 ret[(*returnSize)][countArray[count]-1]=temp;
53                 countArray[(*returnSize)]=countArray[count];
54                 sum[(*returnSize)]=back+temp;
55                 temp++;
56                 (*returnSize)++;
57             }
58             temp=ret[count][countArray[count]-1]+1;
59             temp_k=k-countArray[count];
60         }
61         count++;
62     }
63     columnSizes[0]=(int*)malloc(sizeof(int)*(*returnSize));
64     for(int i=0;i<(*returnSize);i++){
65         columnSizes[0][i]=k;
66     }
67     return ret;
68 }

原文地址:https://www.cnblogs.com/Blue-Keroro/p/8467449.html

时间: 2024-10-20 13:57:12

找出k个数相加得n的所有组合的相关文章

leetcode 1: 找出两个数相加等于给定数 two sum

问题描述 对于一个给定的数组,找出2个数,它们满足2个数的和等于一个特定的数,返回这两个数的索引.(从1开始) Given an array of integers, find two numbers such that they add up to a specific target number. The function twoSum should return indices of the two numbers such that they add up to the target,

[面试题]在数组中找出3个数使得它们和为0

给定一个数组S,试找出3个数a, b, c,使得a+b+c=0.也即从集合中找出所有的和为0的3个数. 例如:集合S={-1,0, 1, 2, -1, 4},则满足条件的3个数有2对:(-1, 0, 1)和(-1, 2, -1).注意(-1,1,0)与(-1,0,1)算同一个解,所以不用重复考虑. 当然该例子集合的解也可以写成:(0, 1, -1)和(2, -1, -1). 参考了:http://blog.csdn.net/wangran51/article/details/8858398,他给

用JAVA写一个函数,功能如下: 任意给定一组数, 找出任意数相加之后的结果为35(任意设定)的情况

用JAVA写一个函数.功能如下:任意给定一组数,例如{12,60,-8,99,15,35,17,18},找出任意数相加之后的结果为35(任意设定)的情况. 可以递归算法来解: package test1; import java.util.Arrays; public class demo { public static void main(String[] args) { String str = "12,60,-8,99,15,35,17,18,8,10,11,12"; int s

有两个变量a和b,不用“if”、“? :”、“switch”或其他判断语句,找出两个数中比较大的

1.问题 There are two int variables: a and b, don't use "if"."? :"."switch" or other judgement statement, find out the biggest one of the two numbers. (有两个变量a和b,不用"if"."? :"."switch"或其他判断语句,找出两个数中比较

【c语言】给一组数,只有一个数只出现了一次,其他所有数都是成对出现的。找出这个数

// 给一组数,只有一个数只出现了一次,其他所有数都是成对出现的.找出这个数 #include <stdio.h> int find_one(int arr[], int len) { int i = 0; int ret = 0; for (; i < len; ++i) { ret ^= arr[i]; } return ret; } int main() { int arr[] = { 1, 2, 3, 4, 1, 2, 3 }; printf("%d\n",

【转】已知一个数出现的次数严格超过了一半,请用O(n)的复杂度的算法找出这个数

原文转自:http://blog.csdn.net/zhq651/article/details/7930284 方法1:既然过半,那么用这个数与其他数配对的话,剩余的数字一定还是过半的这个数字.因此可以通过不断删除不同的2个数,直到没有不同的2个数,那么这个数就是要找的数.证明:最坏情况下,只有这个数同别的数配对,并且被删除,剩下的仍旧是这个数,因此得证. 转自:http://www.cnblogs.com/python27/archive/2011/12/15/2289534.html 例:

LeetCode 18 4sum 找出4个数,使得他们的和等于target

题目: Given an array S of n integers, are there elements a, b, c, and d in S such that a + b + c + d = target? Find all unique quadruplets in the array which gives the sum of target. Note: Elements in a quadruplet (a,b,c,d) must be in non-descending or

一组数据中只有一个数字出现一次,其他数成对出现,找出这个数

一组数据中只有一个数字出现了一次,其他所有数字都是成对出现的,请找出这个数字. (使用位运算) 直接使用异或运算. 代码如下: #include<stdio.h> #include<stdlib.h> int main() { int arr[]={3,5,9,2,5,3,2};  int size=sizeof(arr)/sizeof(arr[0]); int i=0,find=0; for(;i<size;i++) { find^=arr[i];//循环进行异或运算 }

【面试题】-数组A中任意两个相邻元素大小相差1,找出某个数在数组A中的位置。(所有位置 )

题目描述 数组A中任意两个相邻元素大小相差1,现给定这样的数组A和目标整数t,找出t在数组A中的位置. 解题思路 对于目标t,由当前位置a[index]比较开始,下一个可能位置为index = abs(t-a[index]),因为要找出所有的位置,所以找出第一个下标位置之后,再从这个下标的下一个开始重新查找. 代码实现 #include <stdio.h> #include <stdlib.h> #include <math.h> int find_num(int a[