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

本文介绍了一种使用递归加回溯的方法来找出所有和为给定正整数M的正整数集合。该算法确保搜索过程递增,并在递归调用结束后进行必要的回退。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

如M=5,

则输出:

1,1,1,1,1

1,2,2

2,3

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

需要注意的地方有两个:

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

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

下面是我的答案。

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

  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. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值