自然数拆分(计蒜客)
这题是一道遍历+数组的组合题。
特点就是将可以组合的数存到数组中,最后依次输出其中的数。
这题很用这种方法很巧,我一开始的想法是没找到一个就输出一个,但是那样子没法进行,因为如果某一条线路是错的,最终无法得到那个数,之前的结果已经被输出了。
所以,这种用数组保留结果的方法就很灵活。每次相加得得到得数将会保留,如果到了递归的终点,它将会输出,最先递归分支的最先输出,输出后其它递归分支也开始更新数组,
同样伴随递归变化的是数组的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 }