自然数的拆分
时间限制: 1s 内存限制: 128MB
题目描述
任何一个大于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
输入格式
输入n。
输出格式
按字典序输出具体的方案。
样例输入
7
样例输出
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
代码
#include <bits/stdc++.h>
using namespace std;
long long n,m;
long long a[1000000];
void dfs(long long x){
if(m==0){
cout<<n<<"=";
for(long long i=1;i<x;i++){
if(i!=x-1)
cout<<a[i]<<"+";
else{
cout<<a[i]<<endl;
}
}
return;
}
for(long long i=1;i<n;i++){
if(x==1||x>1&&i>=a[x-1]&&m-i>=0){//满足条件(后面的数不小于前面的数,不大于m)
a[x]=i;
m-=i;
dfs(x+1);
m+=i;
}
}
}
int main(){
cin>>n;
m=n;
dfs(1);
return 0;
}
总结
与组合的输出问题类似。