2026: 【提高】自然数拆分(递归:简单dfs)

题目来源:

http://oj.jzxx.net/problem.php?id=2026

题目描述:

2026: 【提高】自然数拆分(递归:简单dfs)_第1张图片

题意:

给定一个n,让列出所有的可能拆分情况。

比如n等于5
5=5
5=4+1 (5=1+4看成同一种拆分)
5=3+2
5=3+1+1
5=2+2+1
5=2+1+1+1
5=1+1+1+1+1

思路:dfs(n,m,num):表示用不大于m的数表示n,num为上一次拆分的情况的数组a长度。

参考代码:

#include 
int a[20];//a数组用来存上次拆分的结果 
int k;
void dfs(int n, int m, int num) {//不大于m的数表示n,num为 a数组的长度
	if (n == k && n != m) {
		num = 0;
	}
	if (n == 1) {
		printf("%3d\n",1);
		return;
	} else if (m == 1) {
		for (int i = 0; i < n - 1; i++) {
			printf("%3d",1);
		}
		printf("%3d\n",1);
		return;
	}
	if (n < m) {
		dfs(n, n, num);
	}
	if (n == m) {
		printf("%3d\n", n);
		for (int j = 0; j < num; j++) {
			printf("%3d", a[j]);
		}
		dfs(n, m - 1, num);
	}
	if (n > m) {
		printf("%3d", m);
		a[num++] = m;
		dfs(n - m, m, num);
		num--;
		for (int j = 0; j < num; j++) {
			printf("%3d", a[j]);
		}
		dfs(n, m - 1, num);
	}
}

int main() {
	int n;
	scanf("%d", &n);
	k = n;
	dfs(n, n, 0);
	return 0;
}

你可能感兴趣的:(#,递归,#,搜索,暴力)