求集合的子集、全排列总结
来源:互联网 发布:linux脚本 echo 编辑:程序博客网 时间:2024/05/22 17:06
一、输出n个元素的集合所有的子集,如{a,b,c}的子集就有{},{a},{b},{c},{a,b},{a,c},{b,c},{a,b,c}。
方法1:利用2进制表示
/*对于集合{A,B,C,D},它的非空子集个数为2×2×2×2-1,用二进制表示就是1111,我们规定从左到右第1位对应A,第2位对应B,第3位对应C,第4位对应D。如果相应位为1,则表示存在该字符,否则不存在该字符。如1101就表示{A,B,D}。这样,对于一个n个字符组成的集合,根据n可以算法它的非空子集个数为m(2的n次幂-1),将m转换为二进制数,然后采用每次减1的方法,即可得到所有子集。*/ void SubSets(const char* str){int len = strlen(str);for(int i = 0; i < (1<<len); i++) //2^len 个子集 {cout<<"{ ";//判断数i的二进制中第1<<j位是否为1 for(int j = 0; j < len; j++) {if( (i&(1<<j) ) != 0){cout<<str[j];}}cout<<" }"<<endl;}}
int main()
{const char *str = "abc";SubSets(str);system("pause");}
方法2 :递归
void SubSets(const char* str, char out[], int curr, int start){int n = strlen(str);for(int i = start; i < n; i++){out[curr] = str[i];out[curr+1] = '\0';printf("%s\n", out);if(i < n-1)SubSets(str, out, curr+1, i+1); }}int main(){const char *str = "abc";char *out = new char[strlen(str) + 1];memset(out, 0, strlen(str)+1);SubSets(str, out, 0, 0);system("pause");}
- 求集合的子集、全排列总结
- 回溯法 求集合全排列、子集
- 求数组的全部子集 && 全排列
- 全排列以及集合的子集
- 求集合子集,和全排列的递归算法实现(c++,Dev C++调试通过)
- 求集合的全排列
- 字符串(集合)的全排列和子集
- 求集合的子集
- 求集合的子集
- 求集合的子集
- 求集合的子集
- 求集合的子集
- 求集合的子集
- 求集合的全部子集
- 求集合的所有子集
- 求集合子集的算法
- 求集合的所有子集
- 求一个集合的子集
- GDI BitBlt 问题
- android 获取正在运行的应用程序列表
- 初识xj3d
- 在js中取得gridView某行某列的值
- 在IT界取得成功应该知道的10件事
- 求集合的子集、全排列总结
- js清空FileUpload中的路径+显示、校验图片
- SQL SERVER – FIX : ERROR : (provider: Named Pipes Provider, error: 40 – Could not open a connection
- 让无代理设置参数的软件通过代理服务器联网
- 消息称AT&T正为新款iPhone 9月上市进行筹备
- 汇编语言资源集
- 如何在Eclipse中看Android的源码
- LINQ流水线
- poj2406(kmp,后缀数组)