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

此文为博主原创,转载时请通知博主,并把原文链接放在正文醒目位置。

子集生成问题:给出一个正整数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;x = 0;
 9     while(ch < ‘0‘ || ch > ‘9‘) c = ch,ch = getchar();
10     while(ch <= ‘9‘ && ch >= ‘0‘) x = (x<<1)+(x<<3)+ch-‘0‘,ch = getchar();
11     if(c == ‘-‘) x = -x;
12 }
13
14 int num[105];
15
16 int main()
17 {//子集生成
18     int n;
19     read(n);
20     for(int cnt = 0;cnt < (1<<n);++ cnt)
21     {
22         for(int i = 0;(1<<i) <= cnt;++ i)
23             if(cnt&(1<<i)) printf("%d ",i+1);
24         if(cnt == 0)
25             printf("qwq");
26         puts("");
27     }
28     return 0;
29 }
时间: 2024-11-19 05:02:39

【模板】子集生成 二进制法的相关文章

子集生成 --二进制法

用二进制表示{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存在子集中,否则...

子集生成——二进制法

按位运算大法!! 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

子集生成模板、

1 //子集生成算法:给定一个集合,枚举所有可能的子集. 2 //为了简单起见,讨论的方法中没有重复元素 3 4 //增量构造法 5 #include<cstdio> 6 #include<cmath> 7 void print_subset(int n,int* A,int cur) 8 { 9 for(int i = 0 ; i < cur; ++i) printf("%d",A[i]); 10 printf("\n"); 11 i

C++学习笔记十六-模板和泛型编程(二)

C++学习笔记十六-模板和泛型编程(二) 16.4 类模板成员 1.模板作用域中模板类型的引用: 通常,当使用类模板的名字的时候,必须指定模板形参.这一规则有个例外:在类本身的作用域内部,可以使用类模板的非限定名.例如,在默认构造函数和复制构造函数的声明中,名字 Queue 是 Queue<Type> 缩写表示.实质上,编译器推断,当我们引用类的名字时,引用的是同一版本.因此,复制构造函数定义其实等价于: Queue<Type>(const Queue<Type> &a

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 <<