题目描述
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。现在给你一个自然数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
说明/提示
用回溯做。。。。
n<=8
第一种:
数据比较小,直接暴力
0.0
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n;
int main(){
cin>>n;
if(n==1)printf("\n");
else if(n==2)printf("1+1\n");
else if(n==3)printf("1+1+1\n1+2\n");
else if(n==4)printf("1+1+1+1\n1+1+2\n1+3\n2+2\n");
else if(n==5)printf("1+1+1+1+1\n1+1+1+2\n1+1+3\n1+2+2\n1+4\n2+3\n");
else if(n==6)printf("1+1+1+1+1+1\n1+1+1+1+2\n1+1+1+3\n1+1+2+2\n1+1+4\n1+2+3\n1+5\n2+2+2\n2+4\n3+3\n");
else if(n==7)printf("1+1+1+1+1+1+1\n1+1+1+1+1+2\n1+1+1+1+3\n1+1+1+2+2\n1+1+1+4\n1+1+2+3\n1+1+5\n1+2+2+2\n1+2+4\n1+3+3\n1+6\n2+2+3\n2+5\n3+4\n");
else printf("1+1+1+1+1+1+1+1\n1+1+1+1+1+1+2\n1+1+1+1+1+3\n1+1+1+1+2+2\n1+1+1+1+4\n1+1+1+2+3\n1+1+1+5\n1+1+2+2+2\n1+1+2+4\n1+1+3+3\n1+1+6\n1+2+2+3\n1+2+5\n1+3+4\n1+7\n2+2+2+2\n2+2+4\n2+3+3\n2+6\n3+5\n4+4\n");
return 0;
}
第二种:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,a[10];
int p(int t){
for(int j=1;j<=t-1;j++)
cout<<a[j]<<"+";
cout<<a[t]<<endl;
}
int js(int s,int t){
if(s==0){
p(t-1);
return 0;
}
for(int i=1;i<=s;i++){
if((a[t-1]<=i)&&(i<n)){
a[t]=i,s-=i;
js(s,t+1);
s+=i;
}
}
}
int main(){
cin>>n;
js(n,1);
}