一个很简单的回溯,可以看看 @[SuperNova3333](/user/1156118)
by _____QWQ_____ @ 2024-04-12 17:07:28
ac code:
```cpp
#include <iostream>
using namespace std;
int n;
int out[110];
void dfs(int step,int num,int num1)
{
if(num>n) return ;
if(num==n&&step>=1)
{
cout<<out[1];
for(int i=2;i<=step;i++)
{
cout<<"+"<<out[i];
}
cout<<endl;
return ;
}
for(int i=num1;i<n;i++)
{
out[step+1]=i;
dfs(step+1,num+i,i);
}
}
int main()
{
cin>>n;
dfs(0,0,1);
return 0;
}
```
by _____QWQ_____ @ 2024-04-12 17:09:54
好像不需要这么麻烦吧,看不懂可以私信 @[SuperNova3333](/user/1156118)
by _____QWQ_____ @ 2024-04-12 17:11:55
谢谢QWQ
by SuperNova3333 @ 2024-04-12 17:19:16
@[SuperNova3333](/user/1156118)
```c
#include<cstdio>
#include<iostream>
#include<cstdlib>
using namespace std;
int a[10001]={1},n;
int search(int,int);
int print(int);
int main()
{
cin>>n;
search(n,1);//将要拆分的数n传递给s
return 0;
}
int search(int s,int t)
{
int i;
for(i=a[t-1];i<=s;i++)
if(i<n)//当前数i要大于等于前一位数,且不超过n
{
a[t]=i;//保存当前拆分的数i
s-=i;//s减去数i,s的值将继续拆分
if(s==0)print(t);//当s=0时,拆分结束输出结果
else search(s,t+1);//当s>0时,继续递归
s+=i;//回溯:加上拆分的数,以便产生所有可能的拆分
}
}
int print(int t)
{
for(int i=1;i<=t-1;i++)//输出一种拆分方案
cout<<a[i]<<"+";
cout<<a[t]<<endl;
}
```
by MANGO__FRIUT @ 2024-04-12 17:31:18