子集枚举的几种方法

生成{0,1,2,3,...,n-1} 所有子集的三种方法

#include<cstdio>
#include<cstring>
using namespace std;
const int N = 10005;

//增量构造法

//void psubset(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(int i = s; i < n; ++i)
//    {
//        a[cur] = i;
//        psubset(n, a, cur + 1);//递归构造子集
//    }
//}

//位向量法

//void psubset(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;            //选第cur个元素
//    psubset(n, b, cur + 1);
//    b[cur] = 0;            //不选第cur个元素
//    psubset(n, b, cur + 1);
//}

//二进制法

void psubset(int n)
{
    for(int s = 0; s < 1 << n; ++s)
    {
        for(int i = 0; i < n; ++i)
            if(s & (1 << i)) printf("%d ", i);
        printf("\n");
    }
}

int main()
{
    int a[N], n;
    while(scanf("%d", &n))
    {
        psubset(n);
    }
    return 0;
}
时间: 2024-08-12 14:00:48

子集枚举的几种方法的相关文章

java类型枚举的几种方法

常量定义通常有数据库表.配置文件.JAVA静态常量和枚举类中 1.数据库表方式 create table t_USER ( PK_ID NUMBER(10) not null, SEX VARCHAR2(255) check (SEX in(0,1)), USERNAME VARCHAR2(255) ) 其中sex字段就限制了字段取值只能是0和1.这里假定0代表男 1代表女 2.配置文件 user_Type_man=0 user_type_women=1 JAVA静态变量 User类中定义 pu

枚举的七种常见使用方法

枚举的使用的方法有很多,下面举出常用的七种方法: 用法一:常量 在JDK1.5之前,我们定义常量都是:publicstaticfianl.....现在好了,有了枚举,可以把相关的常量分组到一个枚举类型里,而且枚举提供了比常量更多的方法. Java代码 public enum Color { RED, GREEN, BLANK, YELLOW } 用法二:switch JDK1.6之前的switch语句只支持int,char,enum类型,使用枚举,能让我们的代码可读性更强. Java代码 enu

枚举有重复元素的排列的两种方法

我们假设A数组是方案数组,P数组是模板数组. 对于每一种方案,从第一个位置开始放元素,一个一个放. 我们原有的打印全排列的方法是不允许A数组中出现重复元素的,如下代码所示: void dfs(int dp) { if(dp>n) { for(int i=1;i<=n;i++) cout<<a[i]<<" "; ans++; cout<<endl; return; } for(int i=1;i<=n;i++) { if(!vis[i

改善C#程序,提高程序运行效率的50种方法

改善C#程序,提高程序运行效率的50种方法 转自:http://blog.sina.com.cn/s/blog_6f7a7fb501017p8a.html 一.用属性代替可访问的字段 1..NET数据绑定只支持数据绑定,使用属性可以获得数据绑定的好处: 2.在属性的get和set访问器重可使用lock添加多线程的支持. 二.readonly(运行时常量)和const(编译时常量) 1.const只可用于基元类型.枚举.字符串,而readonly则可以是任何的类型: 2.const在编译时将替换成

[BS-14] 打印NSArray和NSDictionary的3种方法

打印NSArray和NSDictionary的3种方法 NSArray *arr = @[@"奔驰",@"宝马",@"路虎",@"Tesla"]; //1.直接打印 NSLog(@"arr:%@",arr); //2.使用for...in遍历 for (NSString *str in arr) { NSLog(@"%@",str); } //3.使用枚举遍历 [arr enumerat

重启网卡的几种方法(命令行,API,

1.重启windows网卡命令 rem 禁用网卡netsh interface set interface 本地连接 disabledrem 启用网卡 netsh interface set interface 本地连接 enabled 2.根据相关信息作出如下修改 rem 禁用网卡netsh interface set interface 以太网 disabledrem 启用网卡 netsh interface set interface 以太网 enabled 三.以下是网上找到的C++代码

uva 11825 Hackers&amp;#39; Crackdown (状压dp,子集枚举)

题目链接:uva 11825 题意: 你是一个黑客,侵入了n台计算机(每台计算机有同样的n种服务),对每台计算机,你能够选择终止一项服务,则他与其相邻的这项服务都终止.你的目标是让很多其它的服务瘫痪(没有计算机有该项服务). 思路:(见大白70页,我的方程与大白不同) 把n个集合P1.P2.Pn分成尽量多的组,使得每组中全部集合的并集等于全集,这里的集合Pi是计算机i及其相邻计算机的集合,用cover[i]表示若干Pi的集合S中全部集合的并集,dp[s]表示子集s最多能够分成多少组,则 假设co

(转)C#进行图像处理的几种方法(Bitmap,BitmapData,IntPtr)

转自 http://blog.sina.com.cn/s/blog_628821950100wh9w.html C#进行图像处理的几种方法 本文讨论了C#图像处理中Bitmap类.BitmapData类和unsafe代码的使用以及字节对齐问题. Bitmap类 命名空间:System.Drawing 封装 GDI+ 位图,此位图由图形图像及其属性的像素数据组成.Bitmap 是用于处理由像素数据定义的图像的对象. 利用C#类进行图像处理,最方便的是使用Bitmap类,使用该类的GetPixel(

Map集合遍历的2种方法

Map是一个集合的接口,是key-value相映射的集合接口,集合遍历的话,需要通过Iterator迭代器来进行. Iterator是什么东西: java.util包下的一个接口: 对 collection 进行迭代的迭代器.迭代器取代了 Java Collections Framework 中的 Enumeration.迭代器与枚举有两点不同: 迭代器允许调用者利用定义良好的语义在迭代期间从迭代器所指向的 collection 移除元素. 方法名称得到了改进 方法摘要  boolean has