时间限制: 1000 ms 空间限制: 262144 KB 具体限制
题目描述
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。拆分成的数字相同但顺序不同被看做是相同的方案,如果1+3与3+1被看做是同一种方案。
输入
输入待拆分的自然数n。
输出
如样例输出若干个拆分方案(具体见样例)。
样例输入
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
数据范围限制
1<=n<=20
题记:
递归问题,可以用深度优先搜索的思想来做。
C++程序如下:
#include<iostream>
using namespace std;
const int N = 1000;
int a[N], n;
void dfs(int num, int step)
{
if(step>2 && num==0)
{
for(int i=1; i<=step-1; i++)
{
if(i == 1)
cout << a[i];
else
cout << "+" << a[i];
}
cout << endl;
}
for(int i=1; i<=num; i++)
{
if(step>=2 && i<a[step-1])
continue;
a[step] = i;
dfs(num-i, step+1);
}
}
int main(){
cin >> n;
dfs(n, 1);
return 0;
}