一个简单的算法题

还没有从过节的情绪中恢复过来,最近都不想写代码,越来越懒了。不想写代码,就写文档吧,今天花了一个上午时间写好了我们公司应用中定义的一个应用层协议的文档,手都打软了。。。。
下午跑到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

评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符 “速评一下”
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页