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

 /**
* Return an array of arrays of size *returnSize.
* The sizes of the arrays are returned as *columnSizes array.
* Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().
*/
#define SIZE 600
int** function(int k, int n, int** columnSizes, int* returnSize) {
int **ret=(int**)malloc(sizeof(int*)*SIZE);
int *sum=(int*)calloc(SIZE,sizeof(int));
int *countArray=(int*)calloc(SIZE,sizeof(int));
int temp_n=n;
int count=;
int temp=;
int temp_k=;
int back=;
*returnSize=;
if(k==){
*returnSize=;
columnSizes[]=(int*)malloc(sizeof(int));
columnSizes[][]=;
ret[]=(int*)malloc(sizeof(int));
ret[][]=n;
return ret;
}
for(int i=;i<SIZE;i++){
ret[i]=(int*)calloc(k,sizeof(int));
}
while(temp*k+(k-)*k/<=n){
ret[(*returnSize)][]=temp;
countArray[(*returnSize)]++;
sum[(*returnSize)]=temp;
temp++;
(*returnSize)++;
}
while(ret[count][]!=){
temp=ret[count][countArray[count]-]+;
temp_k=k-countArray[count];
while(temp*temp_k+(temp_k-)*temp_k/<=(n- sum[count])){
if(temp_k==){
ret[count][countArray[count]]=n- sum[count];
break;
}
ret[count][countArray[count]]=temp;
back=sum[count];
sum[count]=sum[count]+temp;
countArray[count]++;
temp++;
while(temp*temp_k+(temp_k-)*temp_k/<=(n- sum[count])){
for(int i=;i<countArray[count]-;i++){
ret[(*returnSize)][i]=ret[count][i];
}
ret[(*returnSize)][countArray[count]-]=temp;
countArray[(*returnSize)]=countArray[count];
sum[(*returnSize)]=back+temp;
temp++;
(*returnSize)++;
}
temp=ret[count][countArray[count]-]+;
temp_k=k-countArray[count];
}
count++;
}
columnSizes[]=(int*)malloc(sizeof(int)*(*returnSize));
for(int i=;i<(*returnSize);i++){
columnSizes[][i]=k;
}
return ret;
}

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

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

    用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...

  2. 找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数

    找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数 #include<iostream>using namespace s ...

  3. search for a range(找出一个数在数组中开始和结束位置)

    Given an array of integers sorted in ascending order, find the starting and ending position of a giv ...

  4. 找出N个数中最小的k个数问题(复杂度O(N*logk))

    这是一个经典的算法题,下面给出的算法都在给定的数组基础上进行,好处时不用分配新的空间,坏处是会破坏原有的数组,可以自己分配新的空间以避免对原有数组的破坏. 思路一 先直接排序,再取排序后数据的前k个数 ...

  5. java中请给出例子程序:找出两个数的最大公约数和最小公倍数

    9.2 找出12和8的最大公约数和最小公倍数.     public class Test {     public static void main(String[] args) {         ...

  6. 【算法学习笔记】Meissel-Lehmer 算法 (亚线性时间找出素数个数)

    「Meissel-Lehmer 算法」是一种能在亚线性时间复杂度内求出 \(1\sim n\) 内质数个数的一种算法. 在看素数相关论文时发现了这个算法,论文链接:Here. 算法的细节来自 OI w ...

  7. 找出n个数中出现了奇数次的两个数

    如果是找只出现了奇数次的一个数, 那么我们从头异或一遍就可以. 那么如何找出现了奇数次的两个数呢? 首先我们还是从头异或一遍, 然后结果肯定不为0, 对于异或出来的结果, 如果这个数的某一位是1, 说 ...

  8. 3sum(从数组中找出三个数的和为0)

    Given an array S of n integers, are there elements a, b, c in S such that a + b + c = 0? Find all un ...

  9. 已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数

    #include<iostream> using namespace std; //#define maxn 2000010 #include<stdio.h> //int a ...

随机推荐

  1. Sqlserver将数据从一张表插入到另一张表

    1.如果是整个表复制表达如下: insert into table1 select * from table2 2.如果是有选择性的复制数据表达如下: insert into table1(colum ...

  2. 移动端页面点击a标签会有半透明的阴影或红色边框的bug

    好久没有更新了,今天来一发 ^_^ 最近在写移动端页面,测试时发现一个a标签的bug:无论是iOS端还是Android端都存在,当点击a标签,会有一个矩形的透明的阴影闪一下(不同的浏览器阴影的颜色还不 ...

  3. Flask從入門到入土(二)——請求响应與Flask扩展

    ———————————————————————————————————————————————————————————— 一.程序和請求上下文 Flask從客戶端收到請求時,要讓視圖函數能訪問一些對象 ...

  4. 2018/3/2晚11点30分写的程序(C++)

    程序目标:输入一个字符串,竖向输出该字符串.使用string和动态分配内存机制.代码如下: #include<iostream>#include "stdafx.h"# ...

  5. UVA - 12186 Another Crisis (树形DP)

    思路:dp[i]表示让上司i签字至少需要多少工人签字.       转移方程:将i的所有节点根据所需工人数量升序排序,设i需要k个下属签字,dp[i] = sum{dp[v]| 0 <= v & ...

  6. eclipse快捷键及设置

    1.Eclipse设置新建菜单初始项 windows-->Perspective-->Customize Perspective--> 2.Eclipse快捷键 1. ctrl+sh ...

  7. BIOS基础

    Basic Input Output System 基本输入输出系统   固化到主板上-个 ROM芯片上的 程序   为计算机提供最底层.最直接的的硬件设置和控制   以上来自百度   不讨论时软件还 ...

  8. tms320dm6446内核启动分析

    关于达芬奇DM6446,里面内部有两个部分,一个是ARM926ejs的核,还有一个是C64+DSP的视频处理核,而我需要关心的重点是arm926ejs的核(bootload和linux内核) 从boo ...

  9. Linux 系统裁剪笔记 4 (内核配置选项及删改)

     CDROM filesystem support(CONFIG_ISO9660_FS)[Y/m/n/?]有标准光驱的系统应该选Y.Minix fs support(CONFIG_MINIX_FS)[ ...

  10. yii学习笔记--配置文件的配置

    'basePath'=>dirname(__FILE__).DIRECTORY_SEPARATOR.'..', 'name'=>'My Web Application',//项目的名称 / ...