找出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.
/**
* 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的所有组合的更多相关文章
- 用JAVA写一个函数,功能例如以下: 随意给定一组数, 找出随意数相加之后的结果为35(随意设定)的情况
用JAVA写一个函数.功能例如以下:随意给定一组数,比如{12,60,-8,99,15,35,17,18},找出随意数相加之后的结果为35(随意设定)的情况. 能够递归算法来解: package te ...
- 找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
找出数组中出现次数超过一半的数,现在有一个数组,已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数 #include<iostream>using namespace s ...
- search for a range(找出一个数在数组中开始和结束位置)
Given an array of integers sorted in ascending order, find the starting and ending position of a giv ...
- 找出N个数中最小的k个数问题(复杂度O(N*logk))
这是一个经典的算法题,下面给出的算法都在给定的数组基础上进行,好处时不用分配新的空间,坏处是会破坏原有的数组,可以自己分配新的空间以避免对原有数组的破坏. 思路一 先直接排序,再取排序后数据的前k个数 ...
- java中请给出例子程序:找出两个数的最大公约数和最小公倍数
9.2 找出12和8的最大公约数和最小公倍数. public class Test { public static void main(String[] args) { ...
- 【算法学习笔记】Meissel-Lehmer 算法 (亚线性时间找出素数个数)
「Meissel-Lehmer 算法」是一种能在亚线性时间复杂度内求出 \(1\sim n\) 内质数个数的一种算法. 在看素数相关论文时发现了这个算法,论文链接:Here. 算法的细节来自 OI w ...
- 找出n个数中出现了奇数次的两个数
如果是找只出现了奇数次的一个数, 那么我们从头异或一遍就可以. 那么如何找出现了奇数次的两个数呢? 首先我们还是从头异或一遍, 然后结果肯定不为0, 对于异或出来的结果, 如果这个数的某一位是1, 说 ...
- 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 ...
- 已知一个数出现的次数超过了一半,请用O(n)的复杂度的算法找出这个数
#include<iostream> using namespace std; //#define maxn 2000010 #include<stdio.h> //int a ...
随机推荐
- windows系统下安装node
最近项目中需要使用到vue框架来实现前后端分离,于是抽时间看了下vue的相关只是,从官网了解到可以使用命令行工具(CLI)来构建应用,于是在本地环境预练了一下 下面这句话摘抄自vue文档: Vue.j ...
- 韩信点兵(hanxin)
相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排.五人一排.七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了.输入包含多组数据,每组数据包含3个非负整数a,b,c,表 ...
- MySQL的InnoDB引擎与MyISAM引擎
MyISAM:这个是默认类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.与 ...
- caffe之路-SIGTERM信号捕捉
Caffe在1.0版本仅支持两种信号的处理: 1) SIGHUP 2) SIGINT SIGHUP:caffe接收到此信号后进行snapshot,并不会中断caffe的训练. SIGINT:caffe ...
- datanode启动不起来的各种原因
一般在数据节点的log日志信息里能找到导致启动不起来的原因. 1.Namenode和Datanode的NamenodeID不一致 描述:一般在集群多次重新格式化HDFS之后,或者刚安装时会碰到.日志信 ...
- select, poll, epoll的实现分析
select, poll, epoll都是Linux上的IO多路复用机制.知其然知其所以然,为了更好地理解其底层实现,这几天我阅读了这三个系统调用的源码. 以下源代码摘自Linux4.4.0内核. 预 ...
- jquery 图片转为base64
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...
- 深度学习篇——Tensorflow-GPU配置
tensoflow-gpu安装 对于python 3.5和3.6的童鞋们而言,安装tensorflow其实并不难,因为我们可以通过pip直接安装. 不过,第一要求你安装的python是64位的,如下图 ...
- Davinci DM6446开发攻略-UBOOT-2009.03移植2 nand flash的烧写
很长一段时间没有更新博客了,是因为要推出新开发方案和做好客户服务工作,忙得不易乐乎.有关DAVINCI U-BOOT的移植,以前写过一篇u-boot-1.3.4(2008年的),其实和这个u-bo ...
- Caused by: org.xml.sax.SAXParseException; lineNumber: 28; columnNumber: 81;
1.错误描述 严重: Exception sending context initialized event to listener instance of class org.springframe ...