子集生成 --二进制法

用二进制表示{0,1,2,3...n-1}的子集s;从右往左第i位表示元素i是否在集合s中。图2表示10100110是如何展示了集合{1,2,5,7}的。

注意:为了方便,最右边的为总是对应元素0,而不是元素1;

异或最重要的性质就是开关型---异或两次相当于没有异或,即A^B^B=A

根据图1不难看出,A&B,A|B和A^B分别对应集合的交、并和对称差。

1 void print_subset(int n,int s)//s的每一位代表所在为位置的数,当为1的时候表示i存在子集中,否则。。。
2 {
3     for(int i=0;i<n;i++)
4         if(s&(1<<i))//位运算中按位与,或,异或对应集合的交,并和对称差。
5             printf("%d ",i);
6     printf("\n");
7 }

空集为0,全集{0,1,2,、、、n-1}的二进制为n个1,即十进制的2n-1,遍历所有,即求出所有的子集

1 for(int i=0;i<(1<<n);i++)
2         print_subset(n,i);
时间: 2024-09-27 00:05:29

子集生成 --二进制法的相关文章

【模板】子集生成 二进制法

此文为博主原创,转载时请通知博主,并把原文链接放在正文醒目位置. 子集生成问题:给出一个正整数n,输入含有1~n共n个元素的集合的所有子集. 模板代码(qwq表示空集): 1 #include<cstdio> 2 #include<algorithm> 3 #include<cmath> 4 #include<cstring> 5 6 inline void read(int &x) 7 { 8 char ch = getchar(),c = ch;

子集生成——二进制法

按位运算大法!! 1 #include<iostream> 2 using namespace std; 3 4 int a[100]; 5 int n; 6 void subset(){ 7 for(int i=1;i<=(1<<n);i++){ 8 for(int j=0;j<n;j++){ 9 if(i&(1<<j)){ //按位与,左位移 10 cout<<a[j]<<" "; 11 } 12 }

子集生成——增量构造法+位向量法+二进制法

1.增量构造法: 原理图: 1 // 此算法仅用于输出下标,实际运用应输入另一个数组来进行数据的储存 2 #include <bits/stdc++.h> 3 using namespace std; 4 typedef long long ll; 5 typedef unsigned long long ull; 6 #define INF 0X3f3f3f3f 7 const ll MAXN = 1e3 + 7; 8 const ll MOD = 1e9 + 7; 9 int a[10];

一种轻便的生成全集合的方法——二进制法

1 #include <stdio.h> 2 3 void print_subset(int n, int i) { // 打印{0, 1, 2, ..., n-1}的子集S 4 for(int j = 0; j < n; j++) 5 if(i&(1<<j)) printf("%d ", j); // 这里利用了C语言“非0值都为真”的规定 6 printf("\n"); 7 } 8 9 int main() { 10 int

子集生成——暴力求解,枚举

子集生成:给定一个集合,枚举它所有可能的子集.(简单起见,这里假设集合中没有重复元素) 一.增量构造法 思路:一次选出一个元素放到集合中. Code: void print_subset1(int n, int *A, int cur) {//增量构造法 for(int i=0;i<cur;++i) printf("%d ",A[i]); printf("\n"); int s=cur ? A[cur-1]+1 :0;//确定当前元素的最小可能值 for(in

thinkphp整合系列之phpqrcode生成二维码

php生成二维码其实挺简单的:当然指的是使用qrcode类库: 因此关于是否要写这篇博客:我是犹豫了再三的: 不过最后还是决定写下吧:如果有童鞋急着用:就可以直接引了: 再个也可以作为即将写的文章微信支付生成的二维码做个铺垫: 老规矩:以bjyadmin项目示例:http://git.oschina.net/shuaibai123/thinkphp-bjyadmin 1:首先将/ThinkPHP/Library/Vendor/下的Phpqrcode文件夹拷贝到自己的项目中: 2:/Applica

ACM:回溯法,子集生成

(一)增量构造法 #include <iostream> #include <algorithm> using namespace std; const int MAXN = 1000; int A[MAXN], n; void print_subset(int n, int *A, int cur) { for(int i = 0; i < cur; ++i) cout << A[i] << " "; cout <<

uva11205 The broken pedometer 子集生成

PS:此题我在网上找了很久的题解,发现前面好多题解的都是没有指导意义的.后来终于找到了一篇好的题解. 好的题解的链接:http://blog.csdn.net/u013382399/article/details/23516051 我在他的解题的基础上,有了自己的理解. 题意: 有n(100以内)个位数为p(15以内)的二进制数,最少需要几个二进制位就可以把他们区分开. 题目分析: 数据较小,用的是暴力的方法,就是枚举每一个二进制位取或不取.就是相当于是枚举矩阵的列. 刘汝佳的小白书120页提到

js生成二维码以及点击下载二维码

js生成二维码 jquery.qrcode.js可以快速使用页面生成二维码.但改项目有两个小问题:1.不支持中文:2.不支持二维码中间生成图片. 支持中文的jquery-qrcode jquery.qrcode.js默认不支持中文.这跟js的机制有关系,jquery-qrcode这个库是采用 charCodeAt()这个方式进行编码转换的, 而这个方法默认会获取它的 Unicode 编码,一般的解码器都是采用UTF-8, ISO-8859-1等方式,英文是没有问题,如果是中文,一般情况下Unic