子集枚举介绍

集合枚举的意思是从一个集合中找出它的所有子集。集合中每个元素都可以被选或不选,含有n个元素的集合总共有2^{n}个子集(包括全集和空集)

例如考虑集合A=\left \{ 1,2,3,4,5 \right \}和它的4个子集A_{1}=\left \{ 1,3,4,5 \right \}A_{2}=\left \{ 1,4,5 \right \}A_{3}=\left \{ 3 \right \}A_{4}=\left \{ 2,3 \right \},按照某个顺序,把全集A中的每个元素在每个子集中的出现状况用0(没出现)和1(出现了)表示出来。

A中元素12345二进制对应十进制
在A1中的出现情况1011111101a1=29
在A2中的出现情况1001110011a2=25
在A3中的出现情况0010000100a3=4
在A4中的出现情况0110000110a4=6

通过上面的表格就可以发现A的子集A1可以表示为一个二进制数11101,对应十进制变量a1=29,反之,这个数字也可以表示子集A1。注意,这边的集合是大写字母,集合对应的数字是小写字母。同理,A2可以表示为二进制数11001。此时找到了一种让子集对应于二进制数的很直观的方法

本例一共有5个元素,表示仅包含第i个元素的集合的数字可以使用位移运算构造,写成1<<(i-1),即2^{i-1},例如要找仅包含第3个元素的集合,那么找a=1<<(3-1),也就是4,此时对应的二进制数为00100,也就是集合{3}。而包含所有元素的全集可以表示成a=(1<<n)-1,空集表示为0。

一些常用的集合关系:

(1)并集:从元素选择角度来说,就是A2、A3包含的元素合并起来能够得到A1。可以发现A1的每一位都等于A2 or A3的结果。变成验证可得a1=a2|a3。只需要把表示两个子集的二进制数进行或运算即可得到两个子集的并集。

(2)交集:是指两个集合中同时存在的元素组成的集合。类似前面的并集运算,当需要两个子集的交集时,可以把表示两个子集的二进制数进行与运算,即a3=a1&a4。

(3)包含:集合A2的所有元素都在A1中出现,说明A1包含A2。易知A1并A2是A1,同时A1交A2是A2,也就是判断A1是否包含A2可以写成(a1|a2==a1)&&(a1&a2==a2)

(4)属于:是指某个元素在集合中,是包含的一种特殊情况--只需检查单独某项元素构成的集合是否是另一个集合的子集。一般地,可以使用户左移运算构造出那个仅含一项的集合,然后再和原集合取交,若不为空集,则命题为真。如果要判断第3个元素是否属于A1,可以写成1<<(3-1)&a1

(5)补集:是指全集去除了某个集合后剩下元素组成的集合。可以使用异或运算来表示集合对全集的补集,例如A2对于全集的补集就是A3。A2的补集可以表示为a^a2。

 注意:枚举子集的时间复杂度是O\left ( 2^{n} \right ),一般情况下1秒钟可以枚举包含20-30个元素的集合的子集。

具体的例题运用,可以参照此专栏的题解。

P1036 [NOIP2002 普及组] 选数题解-CSDN博客

P1157 组合的输出题解-CSDN博客

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/671323.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode:9.回文数,对整数的反转操作

博主本想找个简单的题水一下&#xff0c;结果太久没写这块的代码&#xff0c;直接写着宕机着&#xff0c;十分难受&#xff0c;最后还调试了几下&#xff0c;悲&#xff0c; 目录 题目&#xff1a; 思路&#xff1a; 官方代码&#xff08;反转一半的&#xff09;&#xff1a…

酷开科技,打造非凡的生活体验

酷开科技&#xff0c;作为一家专注于智能电视操作系统研发及智能电视运营增值服务的高科技企业&#xff0c;始终致力于为消费者提供非凡的生活体验。通过不断创新的技术和产品&#xff0c;酷开科技为消费者们带来了便捷、舒适、个性化的智能生活。 首先&#xff0c;酷开科技在智…

【Linux笔记】文件系统与软硬链接

一、文件系统概述 1.1、先来聊一聊“磁盘” 在讲解文件系统之前&#xff0c;我觉得有必要先聊一下“磁盘”&#xff0c;因为我觉得如果弄懂了磁盘的存储原理&#xff0c;大家可能更容易理解文件系统是怎么管理数据的&#xff0c;并且理解计算机是怎么将磁盘抽象到文件系统的。…

Lua函数进阶

函数是值类型 《programming in lua》里面举了一个非常生动的例子&#xff1a; a {p print} a.p("Hello World") --> Hello World print math.sin -- print now refers to the sine function a.p(print(1)) --> 0.841470 sin a.p -- sin now refers …

符号绑定和函数绑定

符号绑定 其实我们平常定义的变量等&#xff0c;在编译之后都会被转化为地址&#xff0c;这些变量我们称之为符号。 我们在程序运行的时候&#xff0c;使用变量&#xff0c;其实就是从变量转换的地址中找到内存中存储的数据。符号绑定其实就是: 将我们程序中使用到的变量名等…

Leetcode 518 零钱兑换 II

题意理解&#xff1a; 给你一个整数数组 coins 表示不同面额的硬币&#xff0c;另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额&#xff0c;返回 0 。 将coins看作不同重量的背包&#xff0c;然后把要凑成的组…

unity实现第一人称和第三人称

在角色设置两个挂载点&#xff0c;第一人称时&#xff0c;相机放在eys上面&#xff0c;切换第三人称时&#xff0c;放置到3rd节点上面&#xff0c;调整节点位置&#xff0c;达到期望效果 代码 void ThirdView(){Debug.Log("切换到第三人称");camera.SetParent(third…

C# Task的使用

C#中的Task类是.NET框架中用于实现异步编程的核心组件之一&#xff0c;它在.NET Framework 4及更高版本以及.NET Core中广泛使用。Task对象代表一个异步操作&#xff0c;并提供了跟踪异步操作状态、获取结果和处理完成通知的方法。 Task 类提供了对异步操作的封装&#xff0c;…

SaperaCamExpert(相机专家)中文使用指南

参考&#xff1a;SaperaCamExpert中文使用指南.PDF 文章目录 软件介绍安装首次打开资源占用率功能主界面布局菜单栏FileViewPre-Processing&#xff1a;预处理 Tools&#xff1a; 快捷键&#xff1a;新建&#xff1b;打开&#xff1b;保存&#xff1b;帮助Device窗体属性树图像…

【MATLAB】使用梯度提升树在回归预测任务中进行特征选择(深度学习的数据集处理)

1.梯度提升树在神经网络的应用 使用梯度提升树进行特征选择的好处在于可以得到特征的重要性分数&#xff0c;从而识别出对目标变量预测最具影响力的特征。这有助于简化模型并提高其泛化能力&#xff0c;减少过拟合的风险&#xff0c;并且可以加快模型训练和推理速度。此外&…

莉莉与神奇花朵的冒险

现在&#xff0c;我将根据这些步骤编写一个对话形式的童话故事。 在很久很久以前的一个小村庄里&#xff0c;有一个勤劳善良的小女孩叫莉莉。她住在一间小茅屋里&#xff0c;和她的奶奶一起生活。奶奶年纪大了&#xff0c;行动不便&#xff0c;所以莉莉每天都要照顾她。 一天&a…

cpp智能指针篇(一):关于auto_ptr的一切

目录 写在前面 总览 智能指针的分类 为什么要使用智能指针&#xff1f; auto_ptr 致谢 写在前面 在过去几天中&#xff0c;我深入研究了智能指针的相关知识。这已经不是我第一次学习智能指针了&#xff0c;但这一次&#xff0c;我感觉自己真正理解了智能指针的工作原理。…

springboot war包部署 和jar包部署

文章目录 war包部署设置打包方式为war排除内嵌的tomcat在插件中指定入口类打包测试 jar包部署设置打包方式执行打包测试访问修改插件版本指定jsp打包配置 重新打包测试 war包部署 设置打包方式为war 执行项目打包的方式为 "war" 默认创建springboot项目打包都是ja…

vscode的ssh忽然连不上服务器:远程主机可能不符合glibc和libstdc++ VS Code服务器的先决条件

vscode自动更新了一下就发现连不上服务器了&#xff0c;我寻思估计一大堆人都寄了&#xff0c;一搜&#xff0c;果然哈哈哈哈 然后我直接搜一天内新发布的博客&#xff0c;还真给我搜到了这个问题&#xff0c;按照这个问题里面的回答&#xff08;vscode1.86无法远程连接waitin…

TCP和UDP相关问题(重点)(2)

2.TCP和UDP的使用场景&#xff1f; UDP一般使用在传输数据的准确性要求不是特别高的场景&#xff0c;传输速度块。例如&#xff1a;视频通话&#xff0c;直播&#xff0c;语音。 TCP一般使用在对数据传输准确度特别高的场景&#xff0c;虽然速度慢一些&#xff0c;但也要保证数…

2024.2.6日总结(小程序开发3)

页面配置 页面配置和全局配置的关系&#xff1a; 小程序中&#xff0c;app.json中的window节点&#xff0c;可以全局配置小程序中每个页面的窗口表现 如果某些小程序想要有特殊的窗口表现&#xff0c;可以用页面级别的.json配置文件实现这个需求 页面配置和全局配置冲突时&…

Apache Kafka: 强大消息队列系统的介绍与使用

目录 引言 一、什么是Apache Kafka&#xff1f; 二、核心概念&#xff1a; 三、架构与工作原理&#xff1a; 四、使用实例&#xff1a; 五、优势与挑战&#xff1a; 六、结论&#xff1a; 引言 随着互联网技术的飞速发展&#xff0c;分布式系统变得越来越复杂&#xff0…

SpringBoot之整合PageHelper分页插件

SpringBoot之整合PageHelper分页插件 文章目录 SpringBoot之整合PageHelper分页插件1. 引入坐标2. application.yml配置3. 基本使用4. 对多个查询执行分页1. 默认第一个Select语句会执行分页2. 让Pagehelper也能执行多个分页的方法3. 完整案例 详细配置请查看官网或MyBatis分页…

程序员为什么不喜欢关电脑?

目录 标题&#xff1a;程序员为何乐见电脑长时间处于关闭状态&#xff1f; 引言&#xff1a; 一、思维的延续性&#xff1a; 二、环境的连续性&#xff1a; 三、长时间开机的原因&#xff1a; 四、恢复成本的考量&#xff1a; 结论&#xff1a; 特别的&#xff1a; 不是…

c++ 子进程交互 逻辑

目录 一、主进程逻辑 1、创建子进程时候,写入自己的HWND 2、响应子进程消息