自然数的拆分问题
题目描述
任何一个大于 1 1 1 的自然数 n n n,总可以拆分成若干个小于 n n n 的自然数之和。现在给你一个自然数 n n n,要求你求出 n 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 2\leq n\le 8 2≤n≤8。
思路:为什么想到类似DFS的过程?(当然不是看题解的)因为题目要求按照字典序输出,而DFS生成的答案恰好是字典序。
#include <bits/stdc++.h>
using namespace std;
int a[100] = {1};//每一个数不小于前一个数
void print(int len);
void solve(int num,int pos)//需要拆分的数, 放入的位置
{
if(num == 0) print(pos);
if(num<a[pos-1]) return ;
for(int t=a[pos-1];t<=num;t++)
{
a[pos] = t;
solve(num-t,pos+1);
}
}
void print(int len)//打印输出
{
if(len == 2) return ;
for(int i=1;i<len-1;i++)
{
cout<<a[i]<<'+';
}
cout<<a[len-1]<<endl;
}
int main()
{
int n=0;
cin>>n;
solve(n,1);
return 0;
}