题目描述
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和,求拆分的方案总数和具体的拆分方式。
输入格式 一个整数n
输出格式 一个整数表示方案数,接下来若干行表示方案
样例数据
Input
4
Output
4
n<=暴力一定让你过的数
时间限制:1s
空间限制:256MB
我们用一个暴力搜索的方法将这个数一个个拆分,再计总个数,输出。
如果当那个被拆分的数n变为零且这个拆分出来的数不是本身的时候,说明出现了一种正确的答案,就把总数加一,然后退出这层递归,去模拟下一种拆分方法。如果出现了负数,也就是说这种拆分方法是不行的,也就退出这层递归,继续模拟寻找另一种可行的拆分方法。
我们要将每一个拆出来的数到一个a数组当中储存下来,每次要拆的数都要从这个数的基础上向当前的拆分后所余下的数这个区间范围内选择,这是为了保证拆出来的方案不会有重复。
代码:
#include <bits/stdc++.h>
int sum=1,n,m,i,j;
int a[1000];
void f(int k,int x)
{
inti;
if(x==0 && k-1>1) //判断这个拆分是否成立
{
sum++;
exit;
}
for(i=a[k-1];i<=x;i++) //区间范围循环选择拆分的数
{
a[k]=i;
f(k+1,x-i); //递归
}
}
using namespace std;
int main()
{
cin>>n;
a[0]=1;
f(1,n); //DFS
cout<<sum;
return0;
}