首页 > 其他 > 详细

子集生成方法

时间:2018-02-24 23:45:58      阅读:262      评论:0      收藏:0      [点我收藏+]

问题

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!