欢迎访问 生活随笔!

ag凯发k8国际

当前位置: ag凯发k8国际 > 编程语言 > c/c >内容正文

c/c

c : 二进制法生成子集 -ag凯发k8国际

发布时间:2024/10/14 c/c 19 豆豆
ag凯发k8国际 收集整理的这篇文章主要介绍了 c : 二进制法生成子集 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

    一个有 n 个元素的集合 (n >=0,n为整数),可以生成 2^n个子集。例如 {a,b} 可以生成4个子集    {空}、{a},{b}{a,b}

二进制法就是 从0到 2^n用二进制表示,为1的对应的数组位置元素 纳入子集集合。

例如   a = {a,b,c,d}  有 16 个子集,建立如下表

十进制数二进制数1对应的数组元素结果集
00000 
10001a[3]d
20010a[2]c
30011a[2], a[3]c,d
40100a[1]b
50101a[1],a[3]b,d
60110a[1],a[2]b,c
70111a[1],a[2],a[3]b,c,d
81000a[0]a
91001a[0],a[3]a,d
101010a[0],a[2]a,c
111011a[0],a[2],a[3]a,c,d
121100a[0],a[1]a,b
131101a[0],a[1],a[3]a,b,d
141110a[0],a[1],a[2]a,b,c
151111a[0],a[1],a[2],a[3]a,b,c,d

 

 

/***

获取所有子集* @tparam elemtype 返回值类型* @tparam _inputiterator 线性表的迭代器类型* @param _first1 线性表的起始地址* @param _last1 线性表的结束地址* @param _null 用变量来指定返回值类型避免编译不过* @return 所有子集*/templatevector> makesubset(_inputiterator _first1, _inputiterator _last1, elemtype _null ){int n = _last1 - _first1;vector> ret;// 2的n次方 1< subret;for (int i = 0; i < n; i ) {if (s & (1 << i)) //1左移i位,监测s的哪一位为1,为1的话输出{subret.push_back(*(_first1 i)); // std::cout<调用示例:

#include #include using namespace std; int main(){string aaaa[3]={"7a8","2b2","3c1"};string string1;vector>aaret= makesubset(aaaa, aaaa 3, string1);for (int j = 0; j < aaret.size(); j) {cout<<"{";for (int i = 0; i < aaret[j].size(); i) {cout<< aaret[j][i] <<" ";}cout<<"}\n";}}

 

{}
{7a8 }
{2b2 }
{7a8 2b2 }
{3c1 }
{7a8 3c1 }
{2b2 3c1 }
{7a8 2b2 3c1 }

 

 

 

总结

以上是ag凯发k8国际为你收集整理的c : 二进制法生成子集的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得ag凯发k8国际网站内容还不错,欢迎将ag凯发k8国际推荐给好友。

网站地图