题目描述

任何一个大于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

输入

输入自然数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

思路:

        通过题目描述的样例:

7=1+1+1+1+3

7=1+1+1+2+2

可以发现最后每位数都要大于等于前一位数

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

const int N = 1e6;

int n;
int a[N]={0};
int s=0;
void ans(int step){
	for(int i=1;i<n;i++){
		if(s+i<n && i>=a[step-1]){//要求不小于前一位数
			a[step]=i;
			s+=i;
			ans(step+1);
			s-=i;
		}
		else if(s+i==n && i>=a[step-1]){//要求不小于前一位数,并且加起来等于n
			for(int j=1;j<step;j++){
				cout<<a[j]<<'+';
			}
			cout<<i<<endl;
			return;
		}
	}
}
int main(){
	cin>>n;
	ans(1);
	return 0;
}