【排列组合】子集生成

简介: 【排列组合】子集生成

题目描述:

给定一个集合,枚举它所有可能的子集

这道题的主流算法有三种,本文介绍最难的——二进制法(讲解在代码中)

#include<iostream>
#include<string>
#include<list>
#include<algorithm>
using namespace std;
list<list<int> > getSubstr(string A, int n){
  list<list<int> > res;//用来存储结果 
  //从全1,也就是全选开始,每次减1,正好取完所有的子集
  for(int i = (1<<n)-1; i > 0; i--){ //(1<<n)-1为2的n次方减一,正好对应n位全1的二进制数
    list<int> s;
    for(int j = n-1; j >= 0; j--){ //表示i右移j位,查看没位的二进制数,从而判断数组的该位是否取 
      if((i>>j)&1 == 1) s.push_back(A[j] - '0');//每一个小的集合对应一位数,每j个小几个push到大集合中形成一组解
    }
    res.push_back(s);
  }
  return res;
}
int main(){
  string s;
  cin >> s;
  list<list<int> > res = getSubstr(s,s.length());
  //遍历输出
  for(list<list<int> >::iterator it = res.begin(); it != res.end(); it++){
    //由于C++不像Java,每一个迭代器拿出来的都没法直接当作一个对象,所以这里需要定义一个临时集合
    list<int> rs = *it;
    for(list<int>::iterator it1 = rs.begin(); it1 != rs.end(); it1++){
      cout << *it1;
    }
    cout << " ";
  }
  cout<<endl;
  return 0;
} 
相关文章
排列组合算法
排列组合算法
|
存储 算法
回溯算法:排列与组合详解
回溯算法,本质上是一种穷举算法,属于暴力搜索算法的一种。它虽然可以使用剪枝进行优化,仍不高效,但却实用。它往往能够解决可以抽象成树形结构的问题,亦可以认为是使用 K 层 for循环实现搜索的问题。
158 0
回溯算法:排列与组合详解
|
算法
Day24——组合(回溯算法)
Day24——组合(回溯算法)
103 0
Day24——组合(回溯算法)
|
机器学习/深度学习 算法 中间件
一文学会排列组合解法
一文学会排列组合解法
排列组合相关公式讲解(Anm,Cnm等)
排列组合相关公式讲解(Anm,Cnm等)
3119 0
排列组合相关公式讲解(Anm,Cnm等)
【组合数学】排列组合 ( 排列组合示例 )
【组合数学】排列组合 ( 排列组合示例 )
281 0
排列组合
排列组合在笔试面试中不会太难,一般有以下的特点: image.png 案例1 案例2 案例3 案例4 案例5 案例6 其实还有一些比较难的排列组合的题,这里就不意义列举了。
920 0