[经典算法] 排列组合-N元素集合的所有子集(一)
题目说明:
给定一组数字或符号,产生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合为:{}、{1}、{1,2}、{1,2,3}、{1,3}、{2}、{2,3}、{3}。
题目解析:
如果不考虑字典顺序,则有个简单的方法可以产生所有的集合,思考二进位数字加法,并注意1出现的位置,如果每个位置都对应一个数字,则由1所对应的数字所产生的就是一个集合,例如:
000 | {} |
001 | {3} |
010 | {2} |
011 | {2,3} |
100 | {1} |
101 | {1,3} |
110 | {1,2} |
111 | {1,2,3} |
了解这个方法之后,剩下的就是如何产生二进位数?有许多方法可以使用,您可以使用unsigned型别加上&位元运算来产生;
如果是32个以内的元素集合可以采用unsigned int来储存,这样直接遍历再根据比特位显示出元素就可以了。
- 比如3个元素,则对应最大值是2^3 = 8;
- for (int i=0; i < 8; i++)
- ShowResult(&i, 3); //根据bit位显示结果
这里我假定任意个元素集合求子集合,通过数组来表示任意长位数;
程序代码:
- #include <gtest/gtest.h>
- using namespace std;
- void ShowResult(bool Bits[], int nSize)
- {
- cout << "{";
- for (int i=0; i<nSize; ++i)
- {
- if (Bits[i])
- {
- cout << i+1 << " ";
- }
- }
- cout << "}\n";
- }
- bool Add(bool Bits[], int nSize)
- {
- for (int i = nSize -1; i >= 0; --i)
- {
- Bits[i] = !Bits[i]; // 如果是1变成0再进位,如果是0变成1退出。
- if (Bits[i])
- {
- return true;
- }
- }
- return false;
- }
- // 二进制法
- int GenerateSubset(int nSize)
- {
- if (nSize==0)
- {
- cout << "{}" << endl;
- return 1;
- }
- int nCount = 0;
- bool *Bits = new bool[nSize];
- memset(Bits, false, sizeof(bool)*nSize);
- do
- {
- ShowResult(Bits, nSize);
- nCount++;
- }
- while(Add(Bits, nSize));
- delete[] Bits;
- return nCount;
- }
- TEST(Algo, tCombination)
- {
- // 0个数子集合数 =〉2^0 = 1
- ASSERT_EQ(GenerateSubset(0), 1);
- // 3个数子集合数 =〉2^3 = 8
- ASSERT_EQ(GenerateSubset(3), 8);
- // 5个数子集合数 =〉2^5 = 32
- ASSERT_EQ(GenerateSubset(5), 32);
- // 10个数子集合数 =〉2^10 = 1024
- ASSERT_EQ(GenerateSubset(10), 1024);
- }
参考引用:
根据组合数和二项式定理
子集个数:Cn0+Cn1+Cn2+...+Cnn = (1+1)^n=2^n
看书、学习、写代码
[经典算法] 排列组合-N元素集合的所有子集(一)的更多相关文章
- [经典算法] 排列组合-N元素集合的所有子集(二)
题目说明: 给定一组数字或符号,按照字典序产生所有可能的集合(包括空集合),例如给定1 2 3,则可能的集合为:{}.{1}.{1,2}.{1,2,3}.{1,3}.{2}.{2,3}.{3}. 题目 ...
- [经典算法] 排列组合-N元素集合的M元素子集
题目说明: 假设有个集合拥有n个元素,任意的从集合中取出m个元素,则这m个元素所形成的可能子集有那些? 题目解析: 假设有5个元素的集合,取出3个元素的可能子集如下: {1 2 3}.{1 2 4 } ...
- python算法-排列组合
排列组合 一.递归 1.自己调用自己 2.找到一个退出的条件 二.全排列:针对给定的一组数据,给出包含所有数据的排列的组合 1:1 1,2:[[1,2],[2,1]] 1,2,3:[[1,2,3],[ ...
- HDU5145:5145 ( NPY and girls ) (莫队算法+排列组合+逆元)
传送门 题意 给出n个数,m次访问,每次询问[L,R]的数有多少种排列 分析 \(n,m<=30000\),我们采用莫队算法,关键在于区间如何\(O(1)\)转移,由排列组合知识得到,如果加入一 ...
- 递归算法之排列组合-求一个集合S的m个元素的组合和所有可能的组合情况
求一个集合S的m个元素组合的所有情况,并打印出来,非常适合采用递归的思路进行求解.因为集合的公式,本身就是递归推导的: C(n,m) = C(n-1,m-1) + C(n-1,m). 根据该公式,每次 ...
- 排列组合或容斥原理 SPOJ - AMR11H
题目链接: https://vjudge.net/contest/237052#problem/H 这里给你一串数字,让你计算同时拥有这串数字最大值和最小值的子集(连续)和子序列(可以不连续)的数量, ...
- PHP的排列组合问题 分别从每一个集合中取出一个元素进行组合,问有多少种组合?
首先说明这是一个数学的排列组合问题C(m,n) = m!/(n!*(m-n)!) 比如:有集合('粉色','红色','蓝色','黑色'),('38码','39码','40码'),('大号','中号') ...
- N个数组中所有元素的排列组合(笛卡尔积)算法
(1)N个数组对象中所有元素排列组合算法 private List<List<Object>> combineAlg(List<Object[]> nArray) ...
- 排列组合算法(PHP)
用php实现的排列组合算法.使用递归算法,效率低,胜在简单易懂.可对付元素不多的情况. //从$input数组中取$m个数的组合算法 function comb($input, $m) { if($m ...
随机推荐
- ACM之最短路径做题笔记与记录
在这里纪念一下从4月开始一直因为事情而荒废了的最短路,多亏了jbb的帮助,我才完成了FZU热身赛一题简单的一个用模拟链表存边以及最短路径的学习,目前(6.5)已经学会使用了最简单的djstral与sp ...
- Android反射出一个类中的其他类对象并调用其对应方法
MainActivity如下: package cn.testreflect; import java.lang.reflect.Field; import java.lang.reflect.Met ...
- 使用dbcp : BasicDataSource
需要 commons-dbcp2 com.oracle.ojdbc6 <dependency> <groupId>org.apache.commons</groupId& ...
- AcceptEx编辑
Windows套接字AcceptEx函数接受一个新的连接,返回本地和远程地址,并接收由客户端应用程序发送的第一块数据.Windows 95/98不支持AcceptEx函数. 平台SDK:Windows ...
- poj - 3683 - Priest John's Busiest Day(2-SAT)
题意:有N场婚礼,每场婚礼的开始时间为Si,结束时间为Ti,每场婚礼有个仪式,历时Di,这个仪式要么在Si时刻开始,要么在Ti-Di时刻开始,问能否安排每场婚礼举行仪式的时间,使主持人John能参加所 ...
- CF 86D Powerful array 【分块算法,n*sqrt(n)】
给定一个数列:A1, A2,……,An,定义Ks为区间(l,r)中s出现的次数. t个查询,每个查询l,r,对区间内所有a[i],求sigma(K^2*a[i]) 离线+分块 将n个数分成sqrt(n ...
- 创建类模式(五):单例(Singleton)
定义 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例. 单例模式一般情况下通过使用private的构造函数确保了在一个应用中只产生一个实例,并且是自行实例化. 和静态变量的区别 虽然 ...
- Notes on Probabilistic Latent Semantic Analysis (PLSA)
转自:http://www.hongliangjie.com/2010/01/04/notes-on-probabilistic-latent-semantic-analysis-plsa/ I hi ...
- 【Python实战02】共享Python代码到PyPI社区
之前学习了Python的列表,以及编写了一个函数来进行列表的输出,这次我们就继续来学习如何把我们已经编写好的代码共享到PyPI社区,这里以上篇文章中编写的print_lol函数为例. 函数转换为模块 ...
- jedis提供的功能
Sorting(排序) Connection handling(连接池) Commands operating on any kind of values Commands operating on ...