子集生成方法

问题

输出n个元素的所有子集,如{a,b,c}的子集为{},{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}

解决

方法1

如果这些子集用0/1表示的话,可表示为000,001,010,100,110,101,011,111,其中1表示这个元素属于这个子集,0表示不属于。

这种0/1表示法让我想到了数据在内存中的存放也是0/1,所以下面用这种思路解决这个问题。

#include <iostream>
#include <cstring>
using namespace std;
void SubsetGeneration(const char *s)
{
    unsigned long long n = 1;
    int len = strlen(s);
    for(int i = 0;i < len;++i)
        n *= 2;
    --n;//n个1组成的数等于 2^n-1
    for(unsigned long long i = 0;i <= n;++i)
    {
        unsigned long long temp = i;
        cout << i+1 << ‘:‘;
        for(int j = 0;j < len;++j)
        {
            if(temp & 1)//判断s中最前位为1还是0
                cout << s[j];
            temp  >>= 1;//将s往后移动1位
        }
        cout << endl;
    }
}
int main()
{
    char a[sizeof(long long)+1];
    while(cin >> a)
    {
        SubsetGeneration(a);
    }
    return 0;
}

撇开运算效率的问题,这种做法无法解决元素数大于sizeof(long long)

原文地址:https://www.cnblogs.com/h-hg/p/8467906.html

时间: 2024-11-14 11:12:45

子集生成方法的相关文章

uva11205 The broken pedometer 子集生成

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

子集生成模板、

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

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

子集生成:给定一个集合,枚举它所有可能的子集.(简单起见,这里假设集合中没有重复元素) 一.增量构造法 思路:一次选出一个元素放到集合中. 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

[计算机漫谈]伪随机数生成方法

大家好.今天说点儿关于程序设计过程中产生随机数的方法. (一)JAVA伪随机数生成方法 随机数在程序设计过程中,特别是在实践环境模拟和测试等领域中得到很广泛的应用,我们在编程的过程中也时不时需要使用到随机数.计算机中的随机数,并不是真正的随机数,而是叫做"伪随机数",是计算机通过某种特别算法模拟产生的. 在JAVA语言中,我们可以通过Math类的random方法产生区间[0,1)的随机数,若要产生[a,a+b)之间的伪随机数,可以通过语句 a + b * Math.random();

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

git patch生成方法

先把修改commit掉,然后生产修改patch给提交代码的同事,具体操作步骤如下: 修改代码的同事: git format-patch al821_xxx origin/al821_xxx 会生成:0001-HQ00656135-xxx-al821_xxx.patch这样的patch文件 把这个patch给提交代码的同事 提交代码的同事,执行: git am 0001-HQ00656135-xxx-al821_xxx.patch 然后可以检查这个提交记录有没有问题,如果没有问题 执行git pu

C# 代码生成器 (存储过程生成方法)

最近研究C#,发现写代码很麻烦,特别是创建实体.模型.接口.工厂.存储过程之类,网上有些开源的,但是不完整,也不能完整的按需求生成,于是,花了三天的时候,结合前辈的一些经验,整合了一些代码生成器,以下是存储过程的生成方法,可以借鉴一下,水平有限,请多指教. 1 /// <summary> 2 /// 创建存储过程 3 /// </summary> 4 public string GetStorage(CodeTable codeTable) 5 { 6 7 Model.Server

Apache SSL CSR OpenSSL生成方法

注册申请SSL证书时,很多都是需先提供CSR(证书签名请求文件),下面介绍一下Apache生成方法.首先SSH登陆服务器,先搭建好Apache等环境,也需要运行yum install mod_ssl安装SSL模块,然后/etc/init.d/httpd restart重启一下Apache服务. 执行以下命令安装OpenSSL: yum install openssl 接着生成KEY和CSR文件: openssl req -new -nodes -newkey rsa:2048 -keyout s

mif文件生成方法

mif文件就是存储器初始化文件,即memory initialization file,用来配置RAM或ROM中的数据.常见生成方法: Quartus自带的mif编辑器生成 mif软件生成 高级编程语言生成 前两种方法都有一定的缺陷,主要介绍第三种方法,按照mif文件格式,使用高级编程语言(Matlab.C)编写生成. 注意: mif文件都是ASCⅡ码,负数应该是用补码处理,否则负数在mif文件中会变成0. Matlab参考代码如下: clc;clear;close all; width = 1