C++ dfs搜索枚举(五十篇)【第十篇】

我需要一些收入,所以可能会开vip,求求了,照顾一下吧~

今天我们接着学习搜索枚举。

1.枚举组合

与枚举排列不同,组合中的数字更像是一个集合,即将不同顺序视为一种。很明显,如果使用与之前相似的枚举手段,将会产生大量的重复。可以直接在之前的代码上修改,不过我们这里先教大家用另一种更直接的方法来枚举组合,我们改变枚举搜索的策略。

我们发现通过枚举每一个数选或者不选就可以把所有组合枚举出来了,此时,我们需要的仅仅是知道现在在看第几个,已经选了几个,这两个数就作为参数,假设我们目前考虑到了第x个,目前选了dep个,那么选这个数以后要去的状态就是(x + 1, dep + 1),不选这个数,要去的状态就是(x + 1, dep)。

写成代码就是下面这样

​​​​​​​
int n, k;
int comb[N];
void dfs(int x, int dep) {
    if (dep == k) {
        for (int i = 0; i < k; i++) {
          cout << comb[i] << " ";
        }
        cout << endl;
        return;
    }
    if (x > n) {
        return;
    }
    comb[dep] = x;
    dfs(x + 1, dep + 1);
    dfs(x + 1, dep);
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值