集合是指由一个或多个确定的元素所构成的整体,也可以当作不分顺序的数组
当集合中不包含任何元素时,我们称它为空集
我们一般用大括号及期中若干元素表示一个集合,例如1,3,5{1,3,5}1,3,5表示包含元素1,3,5的一个集合,a,x,abc{a,x,abc}a,x,abc表示包含三个字符串元素的集合
在集合的元素中没有先后顺序,例如集合1,2,3{1,2,3}1,2,3和{3,1,2}是等价的
在集合中,有一些集合间的关系,我们这种送会用到一个关系是子集,我们说集合A是集合B的子集,表示A钟所有元素都在B中出现(A集合可以是空集)
例如,对于{1,2,3,4,5},{1,3,5}、{2,5}、{4}都是它的子集,而{1,4,6}不是它的子集
一个长度为n的集合,一共有2n22n^22n2个子集
对于集合A,可以用一个二进制数来表示集合A的某个子集B。我们用二进制的每一位表示集合A中的每个元素是否在子集B中出现,1表示出现,0表示未出现
对于集合{0,1,2,3,4,5,6}那么二进制(0101101)2(0101101)_2(0101101)2​就表示子集{0,2,3,5}

二进制数位 6 5 4 3 2 1 0
{二进制数值 0 1 0 1 1 0 1
选取的元素 - 5 - 3 2 - 0

当然,我们还有各种各样的方法来表示子集,但由于计算机内部位运算的便捷性,我们通常借助二进制和位运算完成集合的表示和运算。

例题1:得到整数X

对于 n 个互不相同的正整数,要从这 n 个正整数之中无重复地选取任意个数,使得选出的数的总和为 X。现在你需要求出一共有多少种不同的选取。
对于这道题,我们就可以先枚举这n个数组成的集合的子集,把所有可能的二进制一次枚举,然后根据枚举的二进制对应的子集,从而求出该子集中所有元素的和:
1<<n表示2n2^n2n
KaTeX parse error: Expected 'EOF', got '&' at position 2: i&̲(1<<j)表示i中的第j位是否为1

#include <iostream>
using namespace std;int main() {int n, x, ans = 0, a[30];cin >> n >> x;for (int i = 0; i < n; i++) {cin >> a[i];}for(int i=0;i<(1<<n);i++){int num=0;for(int j=0;j<n;j++){if(i&(1<<j)){num+=a[j];}}if(num==x){ans++;}}cout<<ans<<endl;return 0;
}

例题2:李白打酒

话说大诗人李白,一生好饮。
一天,他提着酒壶,从家里出来,酒壶中有酒两斗。他边走边唱:

  • 无事街上走,提壶去打酒。
  • 逢店加一倍,遇花喝一斗。
    这一路上,他一共遇到店 55 次,遇到花 1010 次,已知最后一次遇到的是花,他正好把酒喝光了。请你计算李白有多少种满足要求的遇到店和花的可能情况。

我们已知遇到点5次,遇到花100次,并且最后一次遇到花,正好把酒喝光。我们可以用01串来表示李白一次遇到的是店还是花,用1表示店,用0表示花。
因为已经确定最后一次遇到的是花,所有我们只需要枚举前14次分别是店还是花,根据枚举出的14位01串,判断是否确保刚好有5个1和9个0,并且最后刚好剩一斗酒

#include <iostream>
using namespace std;
int main() {int ans = 0;for (int i = 0; i < (1 << 14); ++i) {int tot_1 = 0;int tot_0 = 0;int num = 2;for(int j=0;j<14;j++){if(i&(1<<j)){tot_1++;num=num*2;}else{tot_0++;num=num-1;}}if(tot_1==5 && tot_0==9 && num==1){ans++;}}cout << ans << endl;return 0;
}

二进制的应用——枚举子集相关推荐

  1. 二进制枚举子集 CS Maxor 或运算,DP(SOS)

    https://blog.csdn.net/noone0/article/details/78289517 目前没有题目链接. 题意:长度为n的序列a,选出两个元素,其或运算结果的最大值为多少,并求出 ...

  2. Greetings!(枚举子集+dp)

    题目网址https://nanti.jisuanke.com/t/32227 题意: 给n个信(信封有长宽和数目),问在找最多k种信封类型的时候,最少浪费多少纸 思路: 看了看题解,深以为然,这个思路 ...

  3. BZOJ 2560: 串珠子 (状压DP+枚举子集补集+容斥)

    (Noip提高组及以下),有意者请联系Lydsy2012@163.com,仅限教师及家长用户. 2560: 串珠子 Time Limit: 10 Sec Memory Limit: 128 MB Su ...

  4. 牛客挑战赛47 D Lots of Edges(最短路+递归枚举子集)

    牛客挑战赛47 D Lots of Edges 思路:点的权值最多只有(1<<17)-1(131071) ,那我们可以枚举终点的值来算最短路,每个点能连边的值都是固定的,可以通过递归枚举子 ...

  5. CDOJ 1355 柱爷与三叉戟不得不说的故事(枚举子集状压dp)

    柱爷与三叉戟不得不说的故事 Time Limit: 500/500MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Subm ...

  6. [枚举子集]leetcode1255:得分最高的单词集合(hard)

    题目: 题解: 思路:枚举子集 代码如下: class Solution {public:int maxScoreWords(vector<string>& words, vect ...

  7. BZOJ1688|二进制枚举子集| 状态压缩DP

    Disease Manangement 疾病管理 Description Alas! A set of D (1 <= D <= 15) diseases (numbered 1..D) ...

  8. 二进制枚举子集(总结+应用)

    文章目录 定义阐明 简单的知识铺垫 应用举例 代码实现 例题应用 思路如下: 题解如下: 其它例题 定义阐明 1.什么是子集:子集是一个数学概念:如果集合A的任意一个元素都是集合B的元素,那么集合A称 ...

  9. 计蒜客幼儿园买玩具-二进制枚举子集

    问题描述 蒜厂幼儿园有 n 个小朋友,每个小朋友都有自己想玩的玩具.身为幼儿园园长的你决定给幼儿园买一批玩具,由于经费有限,你只能买 m 个玩具.已知玩具商店一共卖 k 种玩具,编号为 1,2,3,- ...

最新文章

  1. 郑冠杰:KDD Cup城市大脑赛题方法总结!
  2. Mozilla Labs Apps Developer Preview发布了
  3. CAS操作与无锁队列
  4. 喜报!神策数据荣获“2019 银行业数字营销大赛”智能营销类金奖
  5. [html] 请说说input的inputmode属性有什么应用场景?
  6. 关于在新建的package中用SetContentView()函数时无法找到已创建的R.layout的布局文件的的问题的解决办法
  7. python缺省参数与多个函数返回值
  8. 截取json字符串算法
  9. 对警报线程池的警报线程_审核和警报SQL Server作业状态更改(启用或禁用)
  10. 解决idea中maven plugins标红的问题
  11. 洛谷——P2550 [AHOI2001]彩票摇奖
  12. Matlab plot默认常用颜色RGB及十六进制颜色代码
  13. webpack ——css兼容性处理
  14. 时间序列(ARIMA)模型
  15. 发个手机全息投影(制作方法已放出,补上世界第一公主)
  16. 零基础入门 Vue3 | 附高清原图
  17. 电脑上的PDF文件太大了怎么办?
  18. 用echarts做如图,x轴左右都是正数的倒立柱形图展示
  19. android用户界面组件都是放置在,Android开发工程师第十章 节 用户界面高级组件.ppt...
  20. 面试记录:光大银行北京分行金融科技岗实习

热门文章

  1. 深入研究Espresso的Idling Resource
  2. mysql cmd insecure_看各路神仙如何大战MySQL insecure warning报警有感
  3. Java学习成长路径
  4. EagleEye简介:户外视频监控分析和面部识别软件
  5. 三星量子计算机,全球首款量子手机来了,某厂商是秀肌肉还是蹭流量?
  6. Windows通过虚拟机的Ubuntu系统安装、配置、管理、远程访问ClickHouse
  7. 服务类采购订单 Service PO
  8. 51nod-1423 最大二“货”(单调栈)
  9. 英语听说计算机查分,2019北京中考英语听说考怎么查分?附一键查询入口
  10. 基于MATLAB/Simulink的电力电子电路仿真技术——三相电流滞环跟踪逆变器