DFS_子集

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <cstdlib>
 5 #include <algorithm>
 6 #include <vector>
 7 #define sc(x) scanf("%d",&(x))
 8 #define sc2(x,y) scanf("%d%d", &(x), &(y))
 9 #define pn printf("%\n")
10 #define PF(x) printf("%d ",x)
11 #define pf(x) printf("%d\n",x)
12 #define CL(x, y) memset(x, y, sizeof(x))
13 #define FOR(i,b,e)  for(int i = b; i <= e; i++)
14 #define max(a, b) (a > b ? a : b)
15 #define ABS(a, b) (a > b ? a - b : b - a)
16 using namespace std;
17 const int MAX = 25;
18 int ans[MAX], used[MAX], n, N = 0;
19 void show();
20 void DFS(int pos);
21 int main()
22 {
23     sc(n);
24     CL(used, 0);
25     DFS(0);
26     cout << "种类为:" << N << endl;
27     return 0;
28 }
29 void DFS(int pos)
30 {
31     if(pos == n)
32     {
33         show();
34         N++;
35         return ;
36     }
37     used[pos] = 0;
38     DFS(pos+1);
39     used[pos] = 1;
40     DFS(pos+1);
41 }
42 void show()
43 {
44     int k = 0;
45     FOR(j,0,n-1)
46 //    PF(used[j]);
47     if(used[j])
48     {
49         PF(j+1);
50         k++;
51     }
52     if(!k)printf("空集");
53     cout << endl;
54 }

时间: 2024-11-12 02:20:17

DFS_子集的相关文章

[ jquery 过滤器 slice(start, [end]) ] 此方法用于在选择器的基础之上精确筛选出匹配的子集(可以使用前导限制范围)

此方法用于在选择器的基础之上精确筛选出匹配的子集(可以使用前导限制范围): 1.start:开始选取子集的位置.第一个元素是0.如果是负数,则可以从集合的尾部开始选起 2.end:结束选取自己的位置,如果不指定,则就是本身的结尾 3.参数包含开始,不包含结束 [ start , end ) 实例: <!DOCTYPE html> <html lang='zh-cn'> <head> <title>Insert you title</title>

Subsets II [leetcode] 从获取子集的递归和循环方法说起,解决重复子集的问题

这一题和Permutation II很像,一个是排列一个是组合. 我们理清思路,从最基本的获取子集的方法开始分析: 获取子集总的来说可以用循环或者递归做,同时还可以根据数字对应的binary code得到. 例如s = {x,y,z}可以生成的组合有:x,y,z,xy,yz,xz,xyz,0 第一种思路: 1. 维护一个集合Set(i),包含s[0...i]可生成的所有组合 s[0...i+1]可以生成的所有组合为:Set(i) + (Set(i)+s[i+1]) void permutatio

拆分集合为相等的子集合(第1届第1题)

题目要求 问题描述:将1到N的连续整数组成的集合划分为两个子集合,且保证每个集合的数字和相等.例如,对于N=4,对应的集合{1,2,3,4},能被划分为{1,4}.{2,3}两个集合,使得1+4=2+3,且划分方案只有此一种.编程实现给定任一正整数N(1<=N<=39),输出其符合题意的划分方案数. 样例输入1:3 样例输出1:1    (可划分为{1,2}.{3}) 样例输入2:4 样例输出2:1    (可划分为{1,3}.{2,4}) 样例输入3:7 样例输出3:4    (可划分为{1

2017盛大游戏杯 零件组装(状态压缩DP之巧妙枚举子集)

题目链接:2017盛大游戏杯 零件组装 题意: 有n个零件,给你相邻关系和排斥关系,每两块零件组装起来有一个代价,问最少的代价总和是多少. 题解: 考虑状态压缩,dp[i]表示i这个集合为一个零件块. 那么要枚举一下i的子集.O(3^n). 先要预处理一下每个集合的排斥个数和相邻个数,然后容斥一下就可以了. 1 #include<bits/stdc++.h> 2 #define mst(a,b) memset(a,b,sizeof(a)) 3 #define F(i,a,b) for(int

利用子集构造法实现NFA到DFA的转换

概述 NFA非有穷自动机,即当前状态识别某个转换条件后到达的后继状态不唯一,这种自动机不便机械实现,而DFA是确定有限状态的自动机,它的状态转换的条件是确定的,且状态数目往往少于NFA,所以DFA能够比较方便的机械实现且识别能力方面也和NFA相当.本次实验采用子集构造法来实现不带空弧的由NFA到DFA的转换. 子集构造法的算法如下: 设NFA为M=(K,Σ,f,S0,Z),则构造相应的DFA  M′=(Q,Σ,f′,I0,F)①取I0=S0:②对于状态集Q中任一尚未标记的状态qi={Si1,Si

集合的子集输出(位运算方式)

问题:怎样找出某个集合的所有子集,怎样找出某个集合指定元素个数的所有子集? 思路:对集合中所有元素进行标记,0表示未选中,1表示选中.假如有一个集合有3个元素为 {1,2,3}, 则 000 表示一个都不选, 001表示选中数组中第一个元素1,010表示选中数组中第2个元素2,011表示选中数组中第1,2个元素即是1,2.... 这样一来,集合{1,2,3}的所有子集(忽略空集)可以表示为 001 -> 111 这样的编码.这样,我们就知道集合的所有子集的个数,即是 2^3=8个.所以,如果我们

【python cookbook】【数据结构与算法】16.从字典中提取子集

问题:想创建一个字典,其本身是另一个字典的子集 解决方案:利用字典推导式(dictionary comprehension)可轻松解决 # example of extracting a subset from a dictionary from pprint import pprint prices = { 'ACME': 45.23, 'AAPL': 612.78, 'IBM': 205.55, 'HPQ': 37.20, 'FB': 10.75 } # Make a dictionary

[示例]NSPredicate基础-查询数组中负荷条件的子集

代码: #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { @autoreleasepool { /* 简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 定义(最常用到的方法): NSPredicate这个类有点类似于数据库中的查询,是用于在一批内容中查询符合条件的子集,中文翻译成“谓词”.这个翻译实在让我感觉很别扭,虽然

Set Difference(所有子集的最值差)

点击打开题目链接https://www.codechef.com/problems/SETDIFF Set Difference Problem code: SETDIFF SUBMIT ALL SUBMISSIONS All submissions for this problem are available. Churu is working as a data scientist in Coderpur. He works on a lot of data on the daily bas