求和为某正整数的所有正整数集合

来源:互联网 发布:淘宝店铺会员卡删除 编辑:程序博客网 时间:2024/06/06 13:23

应该是网易的一道题目?忘记在哪里看到的了。

题目的要求是给定正整数M,求所有和为M的正整数集合。

如M=5,

则输出:

1,1,1,1,1

1,2,2

2,3

这是一道很典型的搜索问题,可以采用递归+回溯的方法来解答。

需要注意的地方有两个:

首先是必须以递增的顺序搜索数组。

其次是要注意递归调用结束后的回退(rollback),

下面是我的答案。

时间复杂度为O(2^n),试了一下M=50的时候,输出结果就是天文数字了。

[cpp] view plaincopyprint?
  1. void Print(int* B, int len)  
  2. {  
  3.     for(int i = 0; i < len; i++)  
  4.     {  
  5.         printf("%d  ", B[i]);  
  6.     }  
  7.     printf("\r\n");  
  8. }  
  9.   
  10. void Helper(int s, int M, int* B, int idx, int sum)  
  11. {  
  12.     if(M <= 0)  
  13.         return;  
  14.     forint i = s; i <= M ; i++)  
  15.     {  
  16.         if( i + sum > M)  
  17.             break;  
  18.           
  19.         B[idx] = i;  
  20.         idx ++;  
  21.         sum += i;  
  22.         if(sum == M)  
  23.         {  
  24.             Print(B, idx);  
  25.             --idx;  
  26.             sum -= i;  
  27.             break;  
  28.         }  
  29.         else  
  30.         {  
  31.             Helper(i, M, B, idx, sum);  
  32.         }  
  33.         --idx;  
  34.         sum -= i;  
  35.     }  
  36.   
  37. }  
  38.   
  39. void Test()  
  40. {  
  41.     int M = 10;  
  42.     int* B = new int[M];  
  43.     Helper(1, M, B, 0, 0);  
  44.     delete [] B;  
  45.   
  46. }  
  47.   
  48.   
  49. int _tmain(int argc, _TCHAR* argv[])  
  50. {  
  51.     Test();  
  52.     return 0;  
  53. }  
原创粉丝点击