二进制法构造子集

#include<cstdio>
void print_subset(int n,int s)
{
    for(int i=0;i<n;i++)
        if(s&(1<<i)) printf("%d ",i);
    printf("\n");
}
int main()

{
    int n=3;
    for(int i=0;i<(1<<n);i++)
        print_subset(n,i);
    return 0;
}
/*

0
1
0 1
2
0 2
1 2
0 1 2
*/

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-08 14:59:10

二进制法构造子集的相关文章

位向量法构造子集

/*子集生成位向量法*/ #include<cstdio> int B[20]; void print_subset(int n,int *B,int cur) { if(cur == n) { for(int i=0;i<cur;i++) if(B[i]) printf("%d ",i); printf("\n"); return ; } B[cur]=1; print_subset(n,B,cur+1); B[cur]=0; print_sub

【算法竞赛入门经典】7.3子集生成【增量构造法】【位向量法】【二进制法】

7.3.1增量构造法 思路:一次选出一个元素放到集合中.自己对于递归的理解还是不够,这里虽然没有明确给出递归停止条件,但是如果无法继续添加元素,就不会再继续递归,然后就是我头疼的回溯啦. #include<stdio.h> int num[4],n; void A(int n,int *a,int ans) { for(int i = 0; i < ans; i ++)//打印当前元素 printf("%d ",a[i]); printf("\n"

构造增量法生成子集

题意: 生成 1~n 集合的子集, 先按元素从小到大再按字典序排列输出 分析: 所谓构造增量法, 就是每次都输出当前数组的元素, 然后再给当前数组最大元素一个增量, 看是否仍然在集合内, 如果在就把他继续放进数组, 输出. 这种方法不需要显式确认递归边界, 如果无法添加元素, 自然就不会再递归了. 数据结构我选用了string , 因为字典序比较容易排序出来. #include <bits/stdc++.h> using namespace std; string ans[1 <<

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

UVa 1151 Buy or Build (最小生成树+二进制法暴力求解)

题意:给定n个点,你的任务是让它们都连通.你可以新建一些边,费用等于两点距离的平方(当然越小越好),另外还有几种“套餐”,可以购买,你购买的话,那么有些边就可以连接起来, 每个“套餐”,也是要花费的,让你求出最少花费. 析:首先想到的是把所有情况都考虑算一下,然后找出最少的,先算没有“套餐”的,然后算有的,用二进制枚举的话,总时间复杂度为O(2qn2+n2logn),这个时间复杂度太大了吧,肯定会超时, 那么我们就可以优化一下,首先先算出来最小生成树,并且把每条边都保存下来,那么加了“套餐”之后

UVa 818Cutting Chains (暴力dfs+位运算+二进制法)

题意:有 n 个圆环,其中有一些已经扣在一起了,现在要打开尽量少的环,使所有的环可以组成一条链. 析:刚开始看的时候,确实是不会啊....现在有点思路,但是还是差一点,方法也不够好,最后还是参考了网上的题解,大神们的代码就是不一样, 但还是看了好久才看懂.首先是用二进制法进行暴力,因为 n 最大才是15,不会超时的,然后就是在暴力时判断打开这些环时,剩下的是不是还存在环, 如果存在那么不是不行的,然后再判断是不是有的环有两个分支以上,因为一个环如果成链那么最多只有两个分支,所以多于两个的也是不对

几何画板追踪法构造阴影方法

几何图形中常常有几条曲线相交,围成一个区域,或者几个图形叠加,有一个重叠部分,如何突出显示这个部分呢?本文教你利用几何画板追踪法画阴影. 以两个圆相交部份为例,操作步骤如下: 利用圆工具绘制两个相交圆.利用线段工具在两圆相交的部份绘制一条线段,端点落在两个圆上. 选中线段,选择“显示”——“追踪线段”.上下移动线段,反复扫描.如果阴影太稀疏,可以增加扫描次数.隐藏线段. 以上内容向大家介绍了利用几何画板追踪法构造阴影的方法,操作非常简单,只要能够理解追踪法即可.几何画板阴影的构造方法有很多,比如

Advanced R之构造子集

构造子集 R构造子集的操作功能强大而且速度快.精通构造子集者可以用简洁的方式表达复杂的操作,很少有其他语言能做到这一点.构造子集学习起来比较困难,因为需要掌握一系列相互关联的概念: 3种构造子集操作符. 6类子集. 不同对象(比如向量.列表.因子.矩阵.数据框)行为上的重要不同. 联合使用构造子集与赋值. 本章将帮助掌握构造子集,让我们从最简单的构造子集开始:用[构造原子向量的子集.然后逐渐扩展你的知识,首先学习更加复杂的数据类型(比如数组和列表),然后是其他构造子集操作符,[[和$.接着你将学

用倍增法构造后缀数组中的SA及RANK数组

感觉后缀数组很难学的说= = 不过总算是啃下来了 首先 我们需要理解一下倍增法构造的原理 设原串的长度为n 对于每个子串 我们将它用'\0'补成长度为2^k的串(2^k-1<n<=2^k) 比如串aba的子串就有 aba'\0'    ba'\0''\0'  a'\0''\0''\0' 每次操作我们可以排出所有长度为 2^x的子串的大小 比如串aba的排序过程 第一遍 a                   a             b 第二遍 a'\0'             ab