今天没怎么写题目,感觉基础知识不太好所以大部分时间都在看《c语言设计学习辅导》。
写了一道搜索题
题目描述
任何一个大于1的自然数n,总可以拆分成若干个小于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
思路就是dfs 每次遍历下去 当你减过那个数,最后再加回来(还原)
代码:
#include<stdio.h>
int n, m=0;
int s[10];
void dsy(int k) //当前操作的数值为k
{
if(n == 0)
{
if(m==1)return;//结束条件
for(int i=1; i<m; i++)
printf("%d+", s[i]);
printf("%d\n",s[m]);
return ;
}
for(int i=k; i<=n; i++)
{
m++;
s[m] = i;//保存当前拆分的数i
n-=i;
dsy(i);//递归
n+=i;//回溯
m--;
}
return;
}
int main()
{
scanf("%d",&n);
m=0;
dsy(1);
return 0;
}