子集枚举算法:C++代码实现及示例

珅泽教育的刘老师的班级有n名学生,编号为1∼n,现在要选出一些人(数量不限),组成一个队伍参加比赛,一共有多少选择方法?要求输出每种方法选出的队伍。

例如有4个人,选出编号1,2,4这三个人组成一个队伍,就是一种选择方法。我们将整个班的学生称作一个集合,选出来的队伍就叫做子集。也可以一个人也不选,这样队伍中一个人都没有,我们把这种子集称作空集。

我们把编号1∼n的学生看做整数1∼n。 写一个递归函数,枚举1∼n中取若干个数的每种方法(子集枚举). 对每种方法把取出的数从小到大排序,若两种方法中前k−1个数的选取情况相同,则取了第k个数的在前. 例如对n=4,应该按如下顺序给出结果

'1 2 3 4' '1 2 3' '1 2 4' '1 2' '1 3 4' '1 3' '1 4' '1' '2 3 4' '2 3' '2 4' '2' '3 4' '3' '4'

输入

一个正整数n

输出

输出2n行, 每行一个子集, 按题目要求顺序.

样例输入

4

样例输出

1 2 3 4
1 2 3
1 2 4
1 2
1 3 4
1 3
1 4
1
2 3 4
2 3
2 4
2
3 4
3
4

代码实现 (C++)

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

void dfs(int n, vector<int>& subset, int index) {
    for (int i = index; i <= n; i++) {
        subset.push_back(i);
        for (int j = 0; j < subset.size(); j++) {
            cout << subset[j] << " ";
        }
        cout << endl;
        dfs(n, subset, i + 1);
        subset.pop_back();
    }
}

int main() {
    int n;
    cin >> n;
    vector<int> subset;
    dfs(n, subset, 1);
    return 0;
}

解释:

  1. 递归函数 dfs(n, subset, index)

    • n:学生总数
    • subset:当前选择的子集
    • index:当前考虑的学生编号
  2. 递归终止条件:index 大于 n 时,递归结束,因为所有学生都已考虑过。

  3. 循环遍历:indexn,枚举每个学生。

  4. 加入当前学生: 将当前学生编号 i 加入到子集中,并输出当前的子集。

  5. 递归调用: 递归调用 dfs 函数,从当前学生 i+1 开始继续枚举子集。

  6. 移除当前学生: 回溯,从子集中移除当前学生编号 i

代码分析:

  • 该代码使用递归的方式,深度优先遍历所有可能的子集。
  • 每个递归调用会探索从当前学生开始的所有可能的选择。
  • 输出时,每次递归调用会输出当前选择的子集。
  • 通过 subset.push_back(i)subset.pop_back() 操作,动态维护当前选择的子集。

总结:

本代码使用递归函数实现子集枚举算法,并提供详细的代码解释和分析,帮助读者理解算法的实现过程和原理。该代码可以作为学习子集枚举算法的参考,并可进一步扩展用于解决其他类似问题。

子集枚举算法:C++代码实现及示例

原文地址: https://www.cveoy.top/t/topic/qhx5 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录