自然数拆分(计蒜客)

这题是一道遍历+数组的组合题。

特点就是将可以组合的数存到数组中,最后依次输出其中的数。

这题很用这种方法很巧,我一开始的想法是没找到一个就输出一个,但是那样子没法进行,因为如果某一条线路是错的,最终无法得到那个数,之前的结果已经被输出了。

所以,这种用数组保留结果的方法就很灵活。每次相加得得到得数将会保留,如果到了递归的终点,它将会输出,最先递归分支的最先输出,输出后其它递归分支也开始更新数组,

同样伴随递归变化的是数组的sindex,代表最后输出有几项。

这一题开始打开了我更了解递归的大门。

 

 

 

 

 1 #include<iostream>
 2 using namespace std;
 3 int a[30];
 4 void dfs(int n,int index, int sindex,int sum)
 5 {
 6     if(sum==n)
 7     {
 8         cout<<n<<"="<<a[0];
 9         for(int i=1;i<sindex;++i)
10         {
11               cout<<"+"<<a[i];
12         }
13         cout<<endl;
14         return ;
15     }
16     if(sum>n)
17         return ;
18     for(int i=index; i<n; ++i)
19     {
20         if(sum+i<=n)
21         {
22             a[sindex]=i;
23             dfs(n,i,sindex+1,sum+i);
24         }
25     }
26 }
27 int main()
28 {
29     int n;
30     cin>>n;
31     dfs(n,1,0,0); 
32     return 0;
33 }

 

posted @ 2020-03-20 21:57  caxi  阅读(293)  评论(0编辑  收藏  举报