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);
}
 
 

你可能感兴趣的:(C++,深度优先,算法,图论)