laifangsong's blog

取长补短,精益求精。 (打个广告,想做手机网站和asp/asp.net网站的可以跟我联系.QQ:25313644)
posts - 51, comments - 193, trackbacks - 0, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

用递归算法求和为指定值N的所有组合

Posted on 2007-01-18 12:55 laifangsong 阅读(276) 评论(1)  编辑 收藏 所属分类: 算法


/*
 CSDN上最近常常问到这样上面的问题,例如,求所有和为10的组合(组合中的数皆为自然数,且各不相同)
*/
#include 
"stdio.h"
#include 
"conio.h"

#define N 10

int num[N];

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[N])
{
    
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");
}

Feedback

#1楼    回复  引用    

2007-07-10 09:14 by xiayu [未注册用户]
12、最少费用旅游路线选择
问题描述:设有n个景点,今从某景点出发不重复遍历各景点,使之旅费最少(即找出一条旅费最少的路径)(对于给出的不同的权,可以是里程最短等)。另外,所有的景点之间都是具有双向路径的,但往返费用可以不一样。
要求:(1)输入:各景点间的旅费表由输入文件提供。
(2)输出:旅费最少的一条路径及总费用,并显示查找过程。
例如: 输入文件名:m.dat
输出文件名:m.out
其中,输入文件m.dat的内容如下:
0 1 2 3 4 5 6
0 0 17 13 9 15 26 12
1 10 0 5 16 11 24 3
2 15 16 0 14 8 11 3
3 17 19 21 0 15 15 6
4 12 13 26 16 0 11 10
5 18 15 16 12 12 0 11
6 9 16 9 15 12 12 0
输出文件m.out的内容如下:
The path is:{最少旅费路径}
Total: {最少旅费数}

标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
"五向定位"职业成长路线公开课(上海、南京、大连)
Google站内搜索


相关链接: