子集枚举算法:C++代码实现及示例
子集枚举算法: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;
}
解释:
-
递归函数 dfs(n, subset, index)
n:学生总数subset:当前选择的子集index:当前考虑的学生编号
-
递归终止条件: 当
index大于n时,递归结束,因为所有学生都已考虑过。 -
循环遍历: 从
index到n,枚举每个学生。 -
加入当前学生: 将当前学生编号
i加入到子集中,并输出当前的子集。 -
递归调用: 递归调用
dfs函数,从当前学生i+1开始继续枚举子集。 -
移除当前学生: 回溯,从子集中移除当前学生编号
i。
代码分析:
- 该代码使用递归的方式,深度优先遍历所有可能的子集。
- 每个递归调用会探索从当前学生开始的所有可能的选择。
- 输出时,每次递归调用会输出当前选择的子集。
- 通过
subset.push_back(i)和subset.pop_back()操作,动态维护当前选择的子集。
总结:
本代码使用递归函数实现子集枚举算法,并提供详细的代码解释和分析,帮助读者理解算法的实现过程和原理。该代码可以作为学习子集枚举算法的参考,并可进一步扩展用于解决其他类似问题。
原文地址: https://www.cveoy.top/t/topic/qhx5 著作权归作者所有。请勿转载和采集!