一个简单的算法题

还没有从过节的情绪中恢复过来,最近都不想写代码,越来越懒了。不想写代码,就写文档吧,今天花了一个上午时间写好了我们公司应用中定义的一个应用层协议的文档,手都打软了。。。。
下午跑到CSDN去逛了哈,看到很多人在讨论这个算法:
http://community.csdn.net/Expert/topic/5362/5362401.xml?temp=.5933344


求数值在 1 - 50 之内的任意5个数之和为100 。
数值:1,2,3,4,5,6....48,49,50
取其中的任意5个数,但这5个数相加之和要等于100,并将所有这种组合罗列
例: 1+10+19+20+50=100
     3+14+16+27+40=100
不能有重复

大多数都是循环实现,我给出我的一个递归实现吧(GCC编译器,DEVCPP下编译通过,计算时间我没算,反正马上出结果,应该不到1秒):

 1 None.gif #include  < conio.h >
 2 None.gif#include  < stdlib.h >
 3 None.gif#include  < stdio.h >
 4 None.gif#include  < dos.h >
 5 None.gif
 6 None.gif
 7 None.gif #define  NUM 5
 8 None.gif #define  LOWER 1
 9 None.gif #define  UPPER 50
10 None.gif #define  MATCH_TOTAL_NUM 100
11 None.gif #define  OUTPUT_FILENAME  "result.txt"
12 None.gif
13 None.gif void  CountNext( int   * num,  int  length,  int  total);
14 None.gif
15 None.gif int  g_num[NUM];
16 None.gif static   int  g_totalWays  =   0 ;
17 None.gifFILE  * g_fp;
18 None.gif
19 None.gif void  CountNext( int   * num,  int  length,  int  total)
20 ExpandedBlockStart.gifContractedBlock.gif dot.gif {   
21InBlock.gif  if(total < 0)
22ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif
23InBlock.gif     return;
24ExpandedSubBlockEnd.gif  }

25InBlock.gif  for(int i = LOWER; i <= UPPER; i++)
26ExpandedSubBlockStart.gifContractedSubBlock.gif  dot.gif
27InBlock.gif    if(length != NUM - 1)                                                          
28ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
29InBlock.gif      if(g_num[length+1>= i)
30InBlock.gif        continue;
31ExpandedSubBlockEnd.gif    }

32InBlock.gif    
33InBlock.gif    g_num[length] = i;    
34InBlock.gif                                    
35InBlock.gif    if(length == 0)  
36ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{                  
37InBlock.gif      if(total != i)
38ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
39InBlock.gif        if(i == UPPER)
40ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
41InBlock.gif          return;
42ExpandedSubBlockEnd.gif        }

43InBlock.gif        continue;      
44ExpandedSubBlockEnd.gif      }

45InBlock.gif      else
46ExpandedSubBlockStart.gifContractedSubBlock.gif      dot.gif{
47InBlock.gif        g_totalWays++;                            
48InBlock.gif        for(int idx = 0; idx < NUM; idx++)
49ExpandedSubBlockStart.gifContractedSubBlock.gif        dot.gif{
50InBlock.gif          fprintf(g_fp, "%d ", g_num[idx]);
51ExpandedSubBlockEnd.gif        }

52InBlock.gif        fputs("\n", g_fp);                                    
53ExpandedSubBlockEnd.gif      }

54InBlock.gif      return;
55ExpandedSubBlockEnd.gif    }

56InBlock.gif           
57InBlock.gif    CountNext(num, length - 1, total - i);
58ExpandedSubBlockEnd.gif  }

59ExpandedBlockEnd.gif}

60 None.gif
61 None.gif int  main() 
62 ExpandedBlockStart.gifContractedBlock.gif dot.gif {
63InBlock.gif  unlink(OUTPUT_FILENAME);
64InBlock.gif  g_fp = fopen(OUTPUT_FILENAME, "at");
65InBlock.gif  CountNext(g_num, NUM - 1, MATCH_TOTAL_NUM);    
66InBlock.gif  fclose(g_fp);
67InBlock.gif  
68InBlock.gif  printf("Total ways = %d\n", g_totalWays);
69InBlock.gif  getch();  
70InBlock.gif  return 0;
71ExpandedBlockEnd.gif}

72 None.gif

转载于:https://www.cnblogs.com/leaway/archive/2007/02/28/659851.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值