AC代码注释写得很详细就不多解释了,如果有不明白的地方欢迎评论留言。
#include<stdio.h>
int n, top;
int line[100];
//我们利用n,保存当前n所剩没有加过的值,然后对当前所剩数进行搜索
void func(int last){//当前操作的数值为last
if(n == 0){
if(top==1)return;//objective 3如何利用top判断前面一项把n全用完了的状态?而且,如果第一项n就用完了,根据题意我们应该怎么操作?
printf("%d",line[1]);//思考:为什么不直接把line[1]放进for循环里呢?符号+
for(int i=2; i<=top; ++i)
printf("+%d", line[i]);
printf("\n");
return ;
}
for(int i=last; i<=n; ++i){
top++;
line[top] = i;//保存当前拆分的数i
n-=i;;//objective 1在进行下一次搜索前要做什么准备?提示:看顶端题解
func(i);//递归
n+=i;//objective 2之后呢?回溯:加上拆分的数,以便产生所有可能的拆分
top--;
}
return;
}
int main(){
scanf("%d",&n);
top=0;//拆分的第top个数,提示:记得初始化变量!有时候就是因为不初始化变量本地ac交题wa。
func(1);
return 0;
}