时间限制: 1 Sec 内存限制: 64 MB
题目描述
输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。
输入
一个整数n,指待拆分的自然数n(l≤n≤30)。
输出
若干行,每一行是一个数的加法式子。
样例输入
4
样例输出
1+3
1+1+2
1+1+1+1
2+2
心路历程
这道题,我,一言难尽啊。我的dfs修改到了3.0版本,可还是wa,打印顺序总是有出入。终于,天无绝人之路。
解题思路:根据样例来看,打印顺序并不是常见的“字典序”,而是“不完全归纳”的一种顺序。
根据不完全归纳,以6为例:
6
=
1
+
5
=
1
+
1
+
4
=
1
+
1
+
1
+
3
=
1
+
1
+
1
+
1
+
2
=
1
+
1
+
1
+
1
+
+
1
+
1
=
2
+
4
=
2
+
2
+
2
=
3
+
3
6=1+5=1+1+4=1+1+1+3=1+1+1+1+2=1+1+1+1++1+1=2+4=2+2+2=3+3
6=1+5=1+1+4=1+1+1+3=1+1+1+1+2=1+1+1+1++1+1=2+4=2+2+2=3+3
也就是按照
a
[
1
]
a[1]
a[1]进行分类,一共有
1
,
2....
n
/
2
1,2....n/2
1,2....n/2.
开始对a数组处理,要给
a
[
1
]
,
a
[
2
]
a[1],a[2]
a[1],a[2]附初始值。
其实就是拆分
f
(
n
)
f(n)
f(n),
f
(
n
)
=
1
+
f
(
n
−
1
)
f(n)=1+f(n-1)
f(n)=1+f(n−1),再将
f
(
n
−
1
)
f(n-1)
f(n−1)拆分;一个递归结束之后,再进行
f
(
n
)
=
2
+
f
(
n
−
2
)
f(n)=2+f(n-2)
f(n)=2+f(n−2)……很显然的一个递归过程。
#include <bits/stdc++.h>
#include<iostream>
#include<algorithm>
#include <cstdio>
//#define local
using namespace std;
typedef unsigned long long ull;
typedef long long ll;
const int N = 1e5+5;
const int inf = 0x3f3f3f3f;
const int mod = 998244353 ;
int n;
int a[100];
void digui(int t){
for(int i=1;i<t;i++)
printf("%d+",a[i]);
printf("%d\n",a[t]);
int cur=a[t];
for(int i=a[t-1];i<=cur/2;i++){
a[t]=i;
a[t+1]=cur-i;
digui(t+1);
}
}
int main()
{
#ifdef local
freopen("input.txt","r",stdin);
#endif
scanf("%d",&n);
for(int i=1;i<=n/2;i++){
a[1]=i;
a[2]=n-i;
digui(2);
}
return 0;
}