2044: 【回溯】自然数的拆分问题-------------------------递归

题目描述
输入自然数N,拆分成由若干数相加的形式,参与加法运算的数可以重复。
输入
待拆分的自然数N。
输出
若干数的加法式子。
样例输入 Copy
7
样例输出 Copy
1+6
1+1+5
1+1+1+4
1+1+1+1+3
1+1+1+1+1+2
1+1+1+1+1+1+1
1+1+1+2+2
1+1+2+3
1+2+4
1+2+2+2
1+3+3
2+5
2+2+3
3+4



#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10000;
int tot;
int n;
int num;
int a[N];
void print(int n)
{
	printf("%d",a[1]);
	for(int i=2;i<=n;i++) printf("+%d",a[i]);
	printf("\n");
 } 
void dfs(int num,int tot)
{
	for(int i=1;i<=num/2;i++)//这边只要处理到一半即可 ,想一想加法 
	{
		if(i>=a[tot-1])  //当前的数必须大于等于前一个数 
		{
			a[tot]=i;a[tot+1]= num-i;//假如现在已经有a[1]=1,a[2]=6(也就是1+6) ,下一个我们需要对6进行分解变成a[2]=1,a[3]=5)(1+5);
			 
			print(tot+1); //打印出来 
			dfs(num-i,tot+1); //因为已经+i了,所以总和减去i 
		}
	}
}
int main()
{
	cin>>n;
	a[0]=0;
	dfs(n,1);
}

你可能感兴趣的:(递归,思维)