自然数的拆分(decompose)
题目描述
任何一个大于 1 的自然数 n ,总可以拆分成若干个小于 n 的自然数之和。
输入
一个整数 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
**#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
int n,sum = 0,s = 0;
int a[10001];
int printf()
{
for(int i = 1;i <= s;i++)
{
printf("%d ",a[i]);
if(i <= s - 1) printf("+");
}
printf(" ");
}
int search(int m)//m表示位数
{
for(int i = a[m - 1];i < n;i++)//可保证每一位数都比后一位数要小
{
s++;//此时数组中有几个数
a[m] = i;
sum = sum + a[m];
if(sum < n) search(m + 1); //满足要求继续搜索
if(sum == n) printf(); //如果满足等式就输出
sum = sum - a[m];
s--;
}
}
int main()
{
freopen("decompose.in","r",stdin);
freopen("decompose.out","w",stdout);
scanf("%d",&n);
a[0] = 1;
search(1);
return 0;
}
***回溯,保证前面那位小于后面的那位。