Generic placeholder image
闲敲代码、落灯花
What's past is prologue

联系邮箱:email@hezehua.net


联系QQ:1907330840

座右铭

保持热情,持续学习,每日精进

生成子集——二进制法

生成子集——二进制法

本文与作者在csdn上的博文【生成子集——二进制法】保持同步


#用二进制位的0和1表示集合中是否存在该元素

要生成0n的子集,先生成0n的二进制序列,这些序列的0、1位正好可以对应一个子集中全集在该位置上的元素是否存在,将其作为子集中存在的元素的标记,输出对应元素。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<conio.h>

using namespace std;
void subset(int n,int s){
    for(int i=0;i<n;i++){
        if(s&(1<<i))printf("%d ",i);
        //s&(1<<i) 遍历s中每一位,看是否为1
    }
    printf("\n");
}
int main(){
    int n=4;
    for(int i=0;i<(1<<n);i++){
    //i<(1<<n) 生成0~n的二进制序列对应的数值
        subset(n,i);
    }
}
猜你喜欢
大数加减
阅读 92

太残忍,半个月不做题,就对题目毫无感觉了,明明思路正确清晰,但敲的代码满满的bug,连输入字符串前要开辟空间都能无视。。。还在输入后就清空了却在后面一个劲的对它操作。。。略怀悲伤地把代码改好了。#include #include #incl...

算法--八皇后问题
阅读 95

在棋盘上放置8个皇后,使得他们不能相互攻击,此时,每个皇后的攻击范围为同行同列和同对角线,要求找出所有解, 回忆之前分析生成排列所用的解答树,我们再把问题简化为四皇后问题,规则不变,写出它的完整解答树 与生成1~n的排列这篇博文中的解答树最大的不同点就是----只有一条或者几条路径可以...

算法--生成可重集排列
阅读 105

在生成1~n的排列一文中,我们获取排列时用了控制不相等来实现让每个数都不重复地出现,所以如果要生成含有重复元素的全排列,对对生成1~n的排列的程序适当修改即可。 首先,把各个元素改成用户输入,输入数组为p,然后把if(a[k]==j)改为if(a[k]==p[j]),a[cur]=j改成a[cur...

算法--生成1~n的排列
阅读 112

在暴力求解法中,我们常常要用上枚举一些简单内容以便方便获得解,若要输出整数n的前n个整数的全排列,则按字典序输出为: (1,2,3),(1,3,2),(2,1,3),(2,3,1),(3,1,2),(3,2,1)。 从中我们似乎发现了一些规律:先输出以1开头的排列,再输出以2开头的排列,然后是3;...

生成子集——位向量法
阅读 94

生成0~n序列的子集对于0~n的每一个值在集合中都有存在和不存在两种状态,所以递归每个值的存在状态即可生成子集#include #include #include #include

最近学习算法,对动态规划不太了解,使用的时候照搬转移方程式,知其然不知其所以然,今天看到一篇动态规划的教程,解释得非常通俗,原文在这里[动态规划入门教程] (http://blog.csdn.net/woshioosm/article/details/7438834),下面我用自己的记忆和理解...

用大数乘法计算阶乘
阅读 112

在比较小的范围内阶乘可以递归实现,而求更大的数的阶乘一般用到long long长整形数,不过,即使这样,在耗时和再大些的阶乘上力有不逮,所以,在输入比较大的情况下,用大数乘法计算阶乘是最好的选择。 计算过程分2步: 1、输入字符串s,将它的值保存到整型n中; 2、从1~i~n-1循环将i转化...

算法--库函数实现全排列
阅读 116

c++的STL中提供了一个库函数next_permutation,代码如下: #include #include #include #include #include #include using namespace std; int main(){ int n,p[10]; ...