正整数有序分拆-回溯用栈实现

回溯用栈实现的4个重要点:

1.回溯的结束条件:栈为空的时候

2.回溯的条件:也即出栈的条件

3.回溯算法深入时候的条件:也即入栈的条件

4.回溯算法深入的状态个数:这个看具体情况

这里拿正整数有序分拆来看一下:



#include <stdio.h>

void main(void)

{

    //n:整数大小 s:记录一共有几种有序分拆 i:打印分拆的循环变量 k:升入的状态个数,这里也就是小于4的自然数

int n, s, top, i, k;

int stack[100];

scanf("%d", &n);

stack[0]=n; k=0; s=0; top=0;

while(top>=0)//回溯结束条件

{

k++;//入栈或者出栈后新一轮开始,升入状态都要加1,当然,如栈后从0开始加1,出栈后从回溯的状态开始加1

if(k>n)//出栈条件

{

k=stack[top]; top--; n=n+k;

}

else if(k<=stack[top])//这里为了“有序”,入栈时做了如此的限制

{

top++; stack[top]=k;

n=n-k; k=0;//如栈后不要忘记这里的状态要恢复k=0时

if(n==0)

{

s++;

for(i=1; i<=top; i++)

printf("%d", stack[i]);

printf("\n");

}

}

}

printf("%d", s);

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值