洛谷P2404自然数的拆分问题

题目描述

任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。现在给你一个自然数n,要求你求出n的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。

输入 #1复制

7

输出 #1复制

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

说明/提示

用回溯做。

n≤8

思路:

循环枚举的数要比n小,避免最后一行输出n。把n的值赋值给m,对m进行拆分,用a数组记录拆分的值,当m拆完时用函数进行输出,否则继续搜索。最后m加回拆分的值,进行回溯。

代码如下:

#include <bits/stdc++.h>
using namespace std;
int n, m, a[9] = { 1 };
void printf(int x)
{
	for (int i = 1; i < x; i++)
		cout << a[i] << '+';
	cout << a[x] << endl;
}
void fun(int sum)
{
	for (int i = a[sum - 1]; i <= m; i++)
	{
		if (i < n)
		{
			a[sum] = i;
			m -= i;
			if (m == 0) printf(sum);
			else fun(sum + 1);
			m += i;
		}
	}
}
int main()
{
	cin >> n;
	m = n;
	fun(1);
	return 0;
}

计算机202 张

猜你喜欢

转载自blog.csdn.net/zjsru_Beginner/article/details/119972036