用递归算法求和为指定值N的所有组合
2007-01-18 12:55
330 查看
/*
CSDN上最近常常问到这样上面的问题,例如,求所有和为10的组合(组合中的数皆为自然数,且各不相同)
*/
#include "stdio.h"
#include "conio.h"
#define N 10
int num
;
main()
{
searchJoinNum(1,N,0); /*调用递归函数*/
getch();
}
/*
_minNum: 最小的被加的数
_sumLeave: 和的剩余值
_arrCurBound: 存放被加的数的数组当前下标?
*/
searchJoinNum(int _minNum,int _sumLeave,int _arrCurBound)
{
int minNum=_minNum;
int sumLeave=_sumLeave;
int arrCurBound=_arrCurBound;
int i,j=arrCurBound,temp;
if(sumLeave==0) /*多次减后被减光*/
{
output(num); /*输出数组,数组元素中不是 NULL 的元素被输出*/
num[arrCurBound-1]=NULL; /*清空上次给数组赋的值,返回到上次递归*/
return;
}
if(sumLeave<minNum) /*不够减时,清空上次给数组赋的值,返回到上次递归*/
{
num[arrCurBound-1]=NULL;
return;
}
for(i=minNum;i<N;i++)
{
temp=sumLeave; /*在循环中保留现场*/
num[j]=i;
sumLeave-=i;
searchJoinNum(i+1,sumLeave,j+1); /*在循环中调用递归,参数特点:被加的数字依次增大*/
sumLeave=temp; /*返回现场*/
}
}
output(int _num
)
{
int i;
printf("%d=",N);
for(i=0;i<N;i++)
{
if(_num[i]==NULL)break;
if(i!=0)
{
printf("+");
}
printf("%d",_num[i]);
}
printf("\n");
}
CSDN上最近常常问到这样上面的问题,例如,求所有和为10的组合(组合中的数皆为自然数,且各不相同)
*/
#include "stdio.h"
#include "conio.h"
#define N 10
int num
;
main()
{
searchJoinNum(1,N,0); /*调用递归函数*/
getch();
}
/*
_minNum: 最小的被加的数
_sumLeave: 和的剩余值
_arrCurBound: 存放被加的数的数组当前下标?
*/
searchJoinNum(int _minNum,int _sumLeave,int _arrCurBound)
{
int minNum=_minNum;
int sumLeave=_sumLeave;
int arrCurBound=_arrCurBound;
int i,j=arrCurBound,temp;
if(sumLeave==0) /*多次减后被减光*/
{
output(num); /*输出数组,数组元素中不是 NULL 的元素被输出*/
num[arrCurBound-1]=NULL; /*清空上次给数组赋的值,返回到上次递归*/
return;
}
if(sumLeave<minNum) /*不够减时,清空上次给数组赋的值,返回到上次递归*/
{
num[arrCurBound-1]=NULL;
return;
}
for(i=minNum;i<N;i++)
{
temp=sumLeave; /*在循环中保留现场*/
num[j]=i;
sumLeave-=i;
searchJoinNum(i+1,sumLeave,j+1); /*在循环中调用递归,参数特点:被加的数字依次增大*/
sumLeave=temp; /*返回现场*/
}
}
output(int _num
)
{
int i;
printf("%d=",N);
for(i=0;i<N;i++)
{
if(_num[i]==NULL)break;
if(i!=0)
{
printf("+");
}
printf("%d",_num[i]);
}
printf("\n");
}
相关文章推荐
- 编程练习:求和为指定数字的所有组合
- 求和为指定数字的所有组合
- java实现 数组中两个元素相加等于指定数的所有组合
- 找出一堆整数中两个元素和为指定值的所有组合
- LeetCode 40 Combination Sum II(数组中求和等于target的所有组合)
- 【每日面试题】输入n求和为m的所有组合
- 从数字列表中,任意三个相加为指定值的所有组合
- 如果一个正整数可以由连续正整数求和而来,输出所有可能的组合
- 两个数组求和为一个固定数值的所有组合java实现
- 算法基础系列之一:非递归求和为数值N的所有组合
- 面试题之输入n求和为m的所有组合
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 字符串所有可能的排列 例如abcd等等 递归算法和排列组合知识结合
- 设计一个算法找到数组中两个元素相加等于指定数的所有组合
- 算法题:求指定数组中和为N的出现的所有组合(二)
- 输出指定括号对数的所有可能组合
- 试题:找出数组中元素和为指定值的所有组合
- [C#] 10进制转62进制,实现穷举指定位数的所有密码组合(暴力破解)
- 给定一列字符,生成指定长度的所有可能的组合
- [面试题]设计一个算法找到数组中两个元素相加等于指定数的所有组合