任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。
当n=7共14种拆分方法:
7=1+1+1+1+1+1+1
7=1+1+1+1+1+2
7=1+1+1+1+3
7=1+1+1+2+2
7=1+1+1+4
7=1+1+2+3
7=1+1+5
7=1+2+2+2
7=1+2+4
7=1+3+3
7=1+6
7=2+2+3
7=2+5
7=3+4
total=14
#include<iostream>
#include<algorithm>
using namespace std;
const int Max = 200;
int n = 0;//输入的n的大小
int a[Max];//存放拆解的数字
int coun = 0;//计数
void dfs(int m, int sum)
{
if (sum == n)//2.结束条件
{
coun++;
cout << n << "=";
for (int i = 1; i < m; i++)
{
cout << a[i];
if (i != m - 1)
{
cout << "+";
}
}
cout << endl;
}
else
{
for (int i = a[m-1]; i < n; i++)
{
if (sum + i > n)
{
break;//3.停止多余的搜索,剪除多余的分支
}
else
{
a[m] = i;
dfs(m + 1, sum + i);
a[m] = 0;//4.回溯时,清理递归的数据,方便之后的递归
}
}
}
}
int main()
{
while (scanf("%d", &n) != EOF)//循环输入
{
a[0] = 1;//一定要设初始值为1,不然啥也没有
dfs(1, 0);//1.深度优先搜索,的根输入,由根分叉
cout << coun << endl;
coun = 0;
}
return 0;
}