回溯算法c语言代码解释,回溯法求组合数-题解(C语言代码)

解题思路:

利用回溯法来求解组合数,我们可以把组合数当成为n个小球抽取m个小球的办法,利用二叉树,n个小球就有n层,用数组x[k]为1时装入左子树,为0时装入右子树,别界条件为没有到达叶结点时,到达m时就回到上一层,进行另一子树,到达叶子点时,如果等于m时就记录下来。以c(4,2)为例:

注意事项:注意累加的初始变化,num和bestnum的在程序变化,while(~scanf("%d%d",&n,&m))这个功能是循环从输入流读取m和n 直到遇到EOF为止等同于while (scanf("%d%d",&m,&n)!=EOF)。

参考代码:

#include

#define N 30

int x[N];

int a[N][N];

int num=0;

int bestnum=0;

void backtrack(int k,int n,int m)

{

int i;

if(k>n)

{

if(num==m){

bestnum++;

}

}

else{

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

{

x[k]=i;

if(i==0)

backtrack(k+1,n,m);

else

{

if(num<=m)

{

num=num+1;

backtrack(k+1,n,m);

num=num-1;

}

}

}

}

}

void main()

{

int n,m;

while(~scanf("%d%d",&n,&m))

{

backtrack(1,n,m);

printf("%ld\n",bestnum);

num=0;

bestnum=0;

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值