C++求数组子集
本文的写作缘由是最近遇到了编写代码解决TSP问题,其中涉及到了求数组的子集,尽管我可以按照题目中给出的数组自己手动构造子集,但是我觉得那样得来并不是很踏实,还是想要写一个程序来更灵活的获取数组所有子集。
举例
输入:
{0,1,2}
输出:
{ },{0},{1},{2},{1,2},{1,3},{2,3},{1,2,3}
开始的时候我从网上查了很多,发现有很多种方法去求子集(二叉树,递归,位运算等),但是我并没有看到能够按照这个顺序来生成数组子集的方法。所以我最终还是自己写了算法。
算法的整体思路不是很难,就是用了我们以往学过的知识,首先找到空集,然后每个元素算一个子集,之后算两个元素的子集。
为了形象一点,我打算直接画个图来说明,从下面这张图我们可以看到,求子集的过程就是从元素由0个,到N个的不断推导的过程,每一层在前一层的基础上,按照上层最后的一个元素向后遍历数组,并加上一个元素。
下面直接上代码
#include<iostream>
#include<vector>
using namespace std;
struct Subset //此结构体表示我们的每个子集
{
int index;//本子集中最后一个元素对应到数组的下标
vector<int> v; //子集用vector数组来表示,方便
};
int get_subset_num(int num) {
//获取数组的子集总个数
int sum = 1;
for (int i =</