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. bzoj 1171 大sz的游戏& 2892 强袭作战 (线段树+单调队列+永久性flag)

    大sz的游戏 Time Limit: 50 Sec  Memory Limit: 357 MBSubmit: 536  Solved: 143[Submit][Status][Discuss] Des ...

  2. Mac下VirtualBox共享文件夹设置

    环境:CentOS7.2最小化安装 步骤: 先安装必要软件包 yum install -y gcc gcc-devel gcc-c++ gcc-c++-devel make kernel kernel ...

  3. home目录迁移至新分区

    在用户home目录越来越大时,就可以考虑将home目录迁移至新的分区. 1.创建新分区. fidisk /dev/sda:用磁盘管理器打开磁盘 n:新建 +10g :设置分区为10G w :保存 保存 ...

  4. 用eclipes写第一个HelloWorld

    打开 eclipes 后,首先点击左上角新建按钮,新建一个项目,如图: 选择 Java Project 选项: 如果没有java Project这个选项的话,选择次一个的 project 也可以,在跳 ...

  5. SQL 脚本持续收集...

    1.复制表 ---sqlserver (包括表结构和表数据) SELECT * INTO TABEL_NEW FROM TABLE_OLD---sqlserver(只复制表结构)CREATE TABL ...

  6. ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(下篇)

    上一篇<ASP.NET没有魔法——ASP.NET MVC 模型绑定解析(上篇)>文章介绍了ASP.NET MVC模型绑定的相关组件和概念,本章将介绍Controller在执行时是如何通过这 ...

  7. python︱Anaconda安装、简介(安装报错问题解决、Jupyter Notebook)

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 安装完anaconda,就相当于安装了Pyth ...

  8. 基于DirectShow的MPEG-4视频传输系统的研究与实现

    1 引言     近年来,随着国民经济的发展,社会各个部门对于视频监视系统的需求越来越多.但目前的很多监视系统都跟具体的硬件相关,必须要具体的采集卡的支持才能实现.所以有必要开发一种具有通用性的视频监 ...

  9. HI3531例子程序说明

    Hisilicon Hi35xx 样例程序使用说明 1. 样例程序文件结构说明    sample            # MPP 样例程序     |-- common       # hi35x ...

  10. 利用squid 搭建简单的透明代理服务器

    环境介绍 虚拟主机1: ip eth0192.168.0.100/24 eth1: 200.168.0.100/24 虚拟主机2(模拟外网) 200.168.0.109/24 (运行web serve ...