数的拆分
题目:输入整数n,输出n的拆分方案,即n=S1+S2+S3+S4+S5......+Sk,且Sn<=S(n+abs(i))啊,按字典序输出。
数据输入:
一行一个整数n,1<=n<=20
数据输出:
所有拆分方案(见样例)
输入:
4
输出:
1+1+1+1
1+1+2
1+3
2+2
4
total=5
题解:
五的拆分如下
1+1+1+1+1
1+1+1+2
1+2+2
1+4
5
可以发现有 "___"的部分是4的拆分
可以枚举一个i,拆分i和n-i,完成搜索,定义数组num表示拆分出来的数,定义变量surplus表示剩余的值(num[idx-1]<=i<=surplus)
完整代码如下:
#include<iostream> #include<cstdio> using namespace std; int num[21]; int n,ans; void print(int x)//输出函数 { ans++;//总数加一 for(int i=1;i<=x-1;i++) printf("%d+",num[i]); printf("%d\n",num[x]); } void dfs(int idx,int surplus) { if(surplus==0)//当剩余值为0时,输出 { if(idx>1) print(idx-1); } else for(int i=num[idx-1];i<=surplus;i++)//否则枚举i { num[idx]=i;//赋值 dfs(idx+1,surplus-i);//深搜 } } int main() { int n; scanf("%d",&n);//读入 num[0]=1; dfs(1,n); printf("total=%d",ans);//输出总数 return 0; }