题目描述
输入自然数n,然后将其拆分成由若干数相加的形式,参与加法运算的数可以重复。
输入
一个整数n,指待拆分的自然数n(l≤n≤30)。
输出
若干行,每一行是一个数的加法式子。
样例输入
复制样例数据
4
样例输出
1+3
1+1+2
1+1+1+1
2+2
按字典序 (回溯)
#include<bits/stdc++.h>
using namespace std;
int shu[10100];
int COUT(int n)
{
for(int i=1; i<n; i++)
{
if(i==1)
printf("%d",shu[i]);
else
printf("+%d",shu[i]);
}
printf("\n");
}
void dfs(int N,int ct)
{
if(N==0&&ct>2)
{
COUT(ct);
return ;
}
for(int i=1; i<=N; i++)
{
if(i>=shu[ct-1])
{
shu[ct]=i;
dfs(N-i,ct+1);
}
}
return;
}
int main()
{
int n;
scanf("%d",&n);
dfs(n,1);
return 0;
}
输出结果
按题目中的搜索序(深搜)
#include<bits/stdc++.h>
using namespace std;
int shu[10100];
int COUT(int n)
{
for(int i=1; i<=n; i++)
{
if(i==1)
printf("%d",shu[i]);
else
printf("+%d",shu[i]);
}
printf("\n");
}
void dfs(int N,int ct)
{
for(int i=1; i<=N/2; i++)
{
if(i>=shu[ct-1])
{
shu[ct]=i;
shu[ct+1]=N-i;
COUT(ct+1);
dfs(N-i,ct+1);
}
}
return;
}
int main()
{
int n;
scanf("%d",&n);
dfs(n,1);
return 0;
}
输出结果