题目描述
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。(n<=100) (注)10=3+7与10=7+3 是同一个拆分
样例输入
7
样例输出
1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4
解题思路
一道搜索题,终止条件就是剩下的为零(其实没有也行的,因为剩下的<=0他会退出for循环的),在递归调用的过程中搜集数,最后输出。
代码实现
#include<bits/stdc++.h>
using namespace std;
int n,r,a[15];
bool f[15];
void Dfs(int t,int m){ //t是搜集数的个数,m是剩下的数值
if(m==0){ //终止条件
for(int i=1;i<t-1;i++) cout<<a[i]<<"+";
cout<<a[t-1]<<"\n";
return ;
}
for(int i=a[t-1];i<=m;i++){ //i枚举比剩下小的数(也就是可能组成N的数)
if(i!=n){
a[t]=i;
Dfs(t+1,m-i);
//a[t]=0可以不加,因为最后输出只到t-1
}
}
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
Dfs(1,n);
return 0;
}
算法:DFS#