集合A的幂集是由集合A的所有子集所组成的的集合。

如:A={1,2,3},则A的幂集P(A)={{1,2,3},{1,2},{1,3},{1},{2,3},{2},{3},{ }}。

求一个集合的幂集就是求一个集合的所有的子集,方法有穷举法,分治法,回溯等

输入:n

输出:集合{1,2,...,n}的幂集


这里采用一个递归的解法,递归思想如下:

0 -> {}

1 -> {} {1}

2 -> {} {1} {2} {1,2}    说明:就是1得出的结果每个都加上2,和原来的1的幂集构成新的幂集。

3 -> {} {1} {2} {1,2} {3} {1,3} {2,3} {1,2,3}  说明:前半部分和2还是一摸一样,后半部分就是2的结果每个都添个3。

…… 不过这个想法我似乎没实现


第二个想法:{1,2,3}的幂集就是选择每个集合内元素是否出现,即1出现与否,2出现与否,3出现与否... 然后想要得到所有结果就遍历0-7,即000-111。0或者1代表了该元素是否被选取。于是有了代码里的 移位(<<) 与(&) 操作


#include <iostream>
#include <math.h>
using namespace std; void printPowerSet(int *set, int set_size)
{ unsigned int pow_set_size = pow(2, set_size);    // 幂集集合个数为2^n int counter, j; /*Run from counter 000..0 to 111..1*/for(counter = 0; counter < pow_set_size; counter++) { cout<<"{";for(j = 0; j < set_size; j++) { /* 1<<0 = 1    1<<1 = 10   1<<2 = 100eg.counter = 7 = 111    那么  set[0] set[1] set[2]都要输出 */if(counter & (1 << j)) cout << set[j]<<" "; } cout<<"}"; }
} /*Driver code*/
int main()
{ cout<<"n=?"<<endl;int n;cin>>n; int set[n];for (int i=0;i<n;i++) set[i] = i+1;printPowerSet(set, n); return 0;
} 

n=?
3
{}{1 }{2 }{1 2 }{3 }{1 3 }{2 3 }{1 2 3 }
--------------------------------

实现的磕磕巴巴的,好难,还是参考别人的,我真菜,真的。


参考:

https://www.geeksforgeeks.org/power-set/

https://www.bilibili.com/video/BV1PE411f7Kx?t=294

https://stackoverflow.com/questions/41629583/if-counter-1j-what-does-this-statement-mean-and-how-it-works/41629671#41629671

(C++)设计算法求集合{1,2,...,n}的幂集相关推荐

  1. 设计算法求集合{1, 2, ..., n}的幂集

    思路: #include <iostream> #include <vector> using namespace std;vector<vector<int> ...

  2. 【C++】设计算法求1000以内的质数数量

    题目: 设计算法求1000以内(包含1000)的质数数量 //求1000以内的质数数量,分析算法的时间复杂度 //author:Mitchell_Donovan //date:2021.3.2 #in ...

  3. 已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和集合B的差集(近由在A中出现而不再B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。

    #include <iostream> using namespace std; //第四题 typedef struct Lnode {int data;struct Lnode *ne ...

  4. 回溯法经典算法 求集合中所有的子集

    今天我们来看一下子集的问题. 题目描述:给定一个任意集合A,集合的长度为Length,让你打印出这个集合中所包含的所有子集. 题目分析:此问题实际上也是一个遍历树的问题,进行遍历每一个子元素,再进入下 ...

  5. 【算法】设计算法求所有强连通分量的完整代码(kosaraju算法)

    代码: typedef struct anode {int adjvex;//该边的邻接点编号struct anode* nexarc;//指向下一条边的指针int weight;//该边的相关信息, ...

  6. 链表练习(一元多项式):一元多项式采用带表头结点的单链表存放,用类C语言设计算法求一元多项式的值。

    注意嗷:这里的一元多项式输入时,指数exp不一定是按照递增顺序输入的,但是最终我们想获得一个指数递增的链表形式,所以在插入新结点时,需要进行判断,把他放在合适的位置. #include<stdi ...

  7. 线性表求集合的交与并

    题目要求(类似的题型也可供参考) 已知A和B均是由整型数据组成的集合,使用线性表表示集合,设计算法求集合A.B的交集和并集,功能包括 输入集合A,输入集合B,求A和B的并集,求A和B的交集.本题中, ...

  8. 【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数

    应用一 设计算法以求解无向图G的连通分量的个数 图示: 深度遍历基本算法dfs(v0)如下 : void dfs(int v0) { visite(v0); visited[v0]=TRUE;w=fi ...

  9. java打印数组的连续非空子集_Apriori算法求数组的非空子集java代码

    Apriori算法求集合的非空子集java代码 public class Test { public static void main(String[] args) { String str=&quo ...

  10. 算法分析与设计实践-作业2-Dijkstra算法求最短距离

    1. 问题 对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径. 2. 解析 Dijkstra算法通过从起始节点往相邻节点不断进行扫描,更新dist数组.path数组和set数组.然后遍历s ...

最新文章

  1. python pexpect telnet_使用python的pexpect模块,实现远程免密登录的示例
  2. 展示前一阵子做的小熊!
  3. SpringMVC处理静态资源
  4. ASP.NET 5 - $.ajax post JSON.stringify(para) is null
  5. 基本值类型(一):序数类型与运算符
  6. 期待!华为P40渲染图再曝光:前置打孔双摄+6.5英寸大屏
  7. JavaScript学习(六十一)—json字符串的解析和JS 对象的序列化
  8. MyBatis与JPA的区别是什么
  9. Qt +ffmpeg(vp8) 记录视频每一帧并生成webm文件格式
  10. build.gradle Failed to resolve:me.relex:circleindicator:1.1.5
  11. 多线程编写12306售票系统
  12. 无法进入网页版小木虫
  13. 安卓多媒体开发!Android高级工程师面试实战,系列篇
  14. android中汉字转为拼音
  15. 浅谈项目经理的工作职责
  16. 极光为华硕 ROG 游戏手机 3 搭建符合统一推送联盟标准的推送系统
  17. RS485和CAN,区别的个人理解
  18. python四种方式打印九九乘法表
  19. 笨鸟先飞学编程系列之二 基础代码的编写1(转)
  20. 计算机组装虚拟仿真,虚拟仿真技术在中职计算机组装与维护课程中的应用探讨...

热门文章

  1. FFmpeg分离音视频,音视频合并,添加多音轨,格式转换,裁切,剪切常用参数详解
  2. java sort 字符串_java字符串怎么排序
  3. 天线罩结构的基础知识
  4. 汉字计算机编码是谁发明的,神奇的汉字编码,了解一下
  5. 【观察】 全新紫光云:“云数智”底盘再升级,背后的三重新价值
  6. bp神经网络模型的优缺点,什么是BP神经网络模型?
  7. 【倒计时】用JS写出京东倒计时效果
  8. 《淘宝网店页面设计、布局、配色、装修一本通(第2版)(全彩)》
  9. 暮光之城2蓝光BD高清下载
  10. rapidxml 给节点赋值时出现乱码问题