代码中有很详细的解释,希望能帮助到不会这道题又觉得题解比较难理解的小伙伴
#include<iostream>//一个搜索问题,洛谷自然数的拆分问题
using namespace std;
int a[10]={1};
int n;
void print(int t)//输出一种拆分方案
{
for(int i=1;i<=t-1;i++)
cout<<a[i]<<"+";
cout<<a[t]<<endl;
}
void search(int sum,int step){//s表示当前需要拆分的总和,step表示当前是第几个数
for(int i=a[step-1];i<=sum;i++){//关键思路:当前数i要大于等于前一位数a[step-1],小于当前需要拆分的总和
if(i<n){//i要小于n的原因是i可能会等于n,而这不是一个合法的解
a[step]=i;//记录当前的数i
sum-=i;//需要拆分的总和减去已经拆分的元素
if(sum==0){//需要拆分的元素已经没有了
print(step);//所以输出一个可能的方案
}
else{
search(sum,step+1);//需要拆分的那个元素还有剩余,就继续拆分它
}
sum+=i;//递归的回溯
}
}
}
int main()
{
cin>>n;
search(n,1);//将要拆分的数n传递给search
return 0;
}