自然数的拆分问题
题目描述
任何一个大于 1 的自然数 n,总可以拆分成若干个小于 n 的自然数之和。现在给你一个自然数 n,要求你求出 n的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。
输入格式
输入:待拆分的自然数 n。
输出格式
输出:若干数的加法式子。
样例 #1
样例输入 #1
7
### 样例输出 #1
```
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
数据保证,2≤n≤8。。
#include <bits/stdc++.h>
using namespace std;
int n,d;
struct solve
{
int q;
}c[100];//利用结构体存储每个数字,方便后面加起来
void dfs (int sum,int k,int num)
{
if (sum>n)return;//判断如果sum太大的话结束掉
if (sum==n)//如果符合条件
{
for (int i=0;i<num-1;i++)
{
cout<<c[i].q<<"+";
}//用循环把结构体存起来的数字输出,注意循环到num-1,不然最后会多输出一个+
cout<<c[num-1].q<<'\n';
return;
}
for (int i=k;i<=n-1;i++)
{
c[num].q=i;//这里用结构体把数字存起来
dfs (sum+i,i,num+1);//dfs深度搜索每个数字三个变量分别代表当前的总和,往后的位置(因为要往后加,不能回过头来加),有几个数字相加
}
}
int main ()
{
cin>>n;d=0;
dfs (0,1,0);
}
找到题目所想表达的意思,自己思考一下,不难AC。如果要像类似输出路径的这类题目就可以用结构体来存储路径后续再用循环将其输出