自然数拆分问题 dfs

传送门p2404
题目要求:

增序输出,由于拆分一个数,所以总和确定。用dfs,每次减去一个i,搜完再回溯加回来就行。

p[ ] 记录数值
n 要拆分的数字
m 见注释

#include <cstdio>
#include <iostream>
using namespace std;
int n,p[11]={1},m; 

void print(int a){
	for(int i=1;i<a;i++)
		cout<<p[i]<<"+";
	cout<<p[a]<<endl;;
}
void dfs(int a){
	for(int i=p[a-1];i<=m;i++){ //增序 
		if(i==n)continue; // 由于 i != n,所以需要一个m来维护剩余数字大小 
		p[a] = i; //记录
		m-=i; 
		if(m==0)print(a);
		else dfs(a+1);
		m+=i; //回溯
	}
}
int main()
{
	cin>>n;
	m=n;  //m用于维护剩余数字大小
	dfs(1);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/zhimeng_LQ/article/details/105927627