(C++)设计算法求集合{1,2,...,n}的幂集
集合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, 2, ..., n}的幂集
思路: #include <iostream> #include <vector> using namespace std;vector<vector<int> ...
- 【C++】设计算法求1000以内的质数数量
题目: 设计算法求1000以内(包含1000)的质数数量 //求1000以内的质数数量,分析算法的时间复杂度 //author:Mitchell_Donovan //date:2021.3.2 #in ...
- 已知两个链表A和B分别表示两个集合,其元素递增排列。请设计算法求出两个集合A和集合B的差集(近由在A中出现而不再B中出现的元素所构成的集合),并以同样的形式存储,同时返回该集合的元素个数。
#include <iostream> using namespace std; //第四题 typedef struct Lnode {int data;struct Lnode *ne ...
- 回溯法经典算法 求集合中所有的子集
今天我们来看一下子集的问题. 题目描述:给定一个任意集合A,集合的长度为Length,让你打印出这个集合中所包含的所有子集. 题目分析:此问题实际上也是一个遍历树的问题,进行遍历每一个子元素,再进入下 ...
- 【算法】设计算法求所有强连通分量的完整代码(kosaraju算法)
代码: typedef struct anode {int adjvex;//该边的邻接点编号struct anode* nexarc;//指向下一条边的指针int weight;//该边的相关信息, ...
- 链表练习(一元多项式):一元多项式采用带表头结点的单链表存放,用类C语言设计算法求一元多项式的值。
注意嗷:这里的一元多项式输入时,指数exp不一定是按照递增顺序输入的,但是最终我们想获得一个指数递增的链表形式,所以在插入新结点时,需要进行判断,把他放在合适的位置. #include<stdi ...
- 线性表求集合的交与并
题目要求(类似的题型也可供参考) 已知A和B均是由整型数据组成的集合,使用线性表表示集合,设计算法求集合A.B的交集和并集,功能包括 输入集合A,输入集合B,求A和B的并集,求A和B的交集.本题中, ...
- 【算法】深度优先搜索遍历的应用 设计算法以求解无向图G的连通分量的个数和无向图G的边数
应用一 设计算法以求解无向图G的连通分量的个数 图示: 深度遍历基本算法dfs(v0)如下 : void dfs(int v0) { visite(v0); visited[v0]=TRUE;w=fi ...
- java打印数组的连续非空子集_Apriori算法求数组的非空子集java代码
Apriori算法求集合的非空子集java代码 public class Test { public static void main(String[] args) { String str=&quo ...
- 算法分析与设计实践-作业2-Dijkstra算法求最短距离
1. 问题 对于下图使用Dijkstra算法求由顶点a到顶点h的最短路径. 2. 解析 Dijkstra算法通过从起始节点往相邻节点不断进行扫描,更新dist数组.path数组和set数组.然后遍历s ...
最新文章
- python pexpect telnet_使用python的pexpect模块,实现远程免密登录的示例
- 展示前一阵子做的小熊!
- SpringMVC处理静态资源
- ASP.NET 5 - $.ajax post JSON.stringify(para) is null
- 基本值类型(一):序数类型与运算符
- 期待!华为P40渲染图再曝光:前置打孔双摄+6.5英寸大屏
- JavaScript学习(六十一)—json字符串的解析和JS 对象的序列化
- MyBatis与JPA的区别是什么
- Qt +ffmpeg(vp8) 记录视频每一帧并生成webm文件格式
- build.gradle Failed to resolve:me.relex:circleindicator:1.1.5
- 多线程编写12306售票系统
- 无法进入网页版小木虫
- 安卓多媒体开发!Android高级工程师面试实战,系列篇
- android中汉字转为拼音
- 浅谈项目经理的工作职责
- 极光为华硕 ROG 游戏手机 3 搭建符合统一推送联盟标准的推送系统
- RS485和CAN,区别的个人理解
- python四种方式打印九九乘法表
- 笨鸟先飞学编程系列之二 基础代码的编写1(转)
- 计算机组装虚拟仿真,虚拟仿真技术在中职计算机组装与维护课程中的应用探讨...
热门文章
- FFmpeg分离音视频,音视频合并,添加多音轨,格式转换,裁切,剪切常用参数详解
- java sort 字符串_java字符串怎么排序
- 天线罩结构的基础知识
- 汉字计算机编码是谁发明的,神奇的汉字编码,了解一下
- 【观察】 全新紫光云:“云数智”底盘再升级,背后的三重新价值
- bp神经网络模型的优缺点,什么是BP神经网络模型?
- 【倒计时】用JS写出京东倒计时效果
- 《淘宝网店页面设计、布局、配色、装修一本通(第2版)(全彩)》
- 暮光之城2蓝光BD高清下载
- rapidxml 给节点赋值时出现乱码问题