题目描述
任何一个大于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 张