组合问题

组合的实现:

 

1.回溯实现
回溯法实现从1~n这n个数中每次取m个数的组合,设置a数组,i从1开始取值,a(1)从1开始到n取值。约定a(1),...,a(i),...,a(m)按升序排列,a(i)后有m-i个大于a(i)的元素,其中最大取值为n,显然a(i)最多取n-m+i,即a(i)回溯的条件是a(i)=n-m+i。
当i<m时,i增加1,a(i)从a(i-1)+1开始取值,直到i=m时输出结果。
当a(i)=n-m+i时,i--回溯,直到i=0时结束。
代码:

 

2.组合的递归实现

应用递归设计,设comb(int n, int k)为从1~n这n个数中取k个数的所有组合结果。当组合的第一个数字选定时,其后的数字是从余下的n-1个数中取k-1个数的组合。这就是把从n个数中取k个数的组合问题转化为从n-1个数中取k-1个数的组合问题。设置数组a存放求出的组合数字,约定函数将确定的k个数字组合的第一个数字放在a[k]中,当一个组合救出后,才将数组a中的一个组合输出。

代码:

 

 

问题提出:在n个不同的元素中取m个允许重复的组合,其组合数为c(n+m-1, m),相当于m个无区别的球放进n个有标志的盒子,每个盒子放的球不加限制的方案数。
设计要点:
为实现可重复的组合,约定1<=a(1)<=a(i)<=a(m)<=n,即按不减顺序排列。当i<m时,i增1,a(i)从a(i-1)开始取值(因为可重复),直至i=m时输出结果。
当a(i)=n时i--回溯(因为组合的每一位置最大都可以取n),直到i=0时结束。

代码:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值