C 如何得到集合的所有可能子集

C 如何得到集合的所有可能子集,c,arrays,subset,C,Arrays,Subset,有人能给我解释一下如何使用复杂度低于或等于以下的算法生成集合的所有子集吗 #include <stdio.h> #include <math.h> void printPowerSet(char *set, int set_size) { /*set_size of power set of a set with set_size n is (2**n -1)*/ unsigned int pow_set_size = pow(2, set_

有人能给我解释一下如何使用复杂度低于或等于以下的算法生成集合的所有子集吗

#include <stdio.h>
#include <math.h>

void printPowerSet(char *set, int set_size)
{
    /*set_size of power set of a set with set_size
      n is (2**n -1)*/
    unsigned int pow_set_size = pow(2, set_size);
    int counter, j;

    /*Run from counter 000..0 to 111..1*/
    for(counter = 0; counter < pow_set_size; counter++)
    {
      for(j = 0; j < set_size; j++)
       {
          /* Check if jth bit in the counter is set
             If set then pront jth element from set */
          if(counter & (1<<j))
            printf("%c", set[j]);
       }
       printf("\n");
    }
}

/*Driver program to test printPowerSet*/
int main()
{
    char set[] = {'a','b','c'};
    printPowerSet(set, 3);

    getchar();
    return 0;
}
我应该得到我的输出

{2} {3} {4} {2,3} {2,4} {3,4} {2,3,4}
免责声明:以下内容旨在展示发电机组的发电概念。
  • 从空集合开始,并将其添加到功率集合
    集合
  • 对于集合的每个元素
    el[i]
    el
    • 对于已存在于
      集合中的每个子集
      添加
      • 通过向后推el[i]
      来增加
      add
    • 将扩充集推送到
下面是
c++

void generateSubset(vector<int>& el) {
    vector<vector<int>> sets;
    sets.push_back(vector<int>());
    for (int i = 0; i < el.size() ; i++) {
        vector<vector<int>> ssets;
        for (int j = 0 ; j < sets.size() ; j++ ) {
            vector<int> add(sets[j]);
            add.push_back(el[i]);
            ssets.push_back(add);
        }
        sets.insert(sets.end(), begin(ssets), end(ssets));
    }
    
//print the subsets
    for (int j = 0 ; j < sets.size() ; j++ ) {
        auto v = sets[j];
        for (auto a : v) {
            cout << a << " ";
        }
        cout << endl;
    }
    cout << "#subsets "<<sets.size() << endl;
}



int main() {
    vector<int> a = {1, 2, 3};
    generateSubset(a);
}
void生成子集(向量和el){
向量集;
set.push_back(vector());
对于(int i=0;i你能问我们是否可能吗?或者我们是否可以为你写它?谷歌“排列”。对于指定的输入,您的实际输出是什么?您是否尝试过在调试器中单步执行代码以查看其行为是否符合要求?您是否尝试过向您的用户解释代码?您是否尝试过在开始编程之前先在纸上解算它?电源集不应该也包括空集吗?不,不需要空集@I阿纳博特
void generateSubset(vector<int>& el) {
    vector<vector<int>> sets;
    sets.push_back(vector<int>());
    for (int i = 0; i < el.size() ; i++) {
        vector<vector<int>> ssets;
        for (int j = 0 ; j < sets.size() ; j++ ) {
            vector<int> add(sets[j]);
            add.push_back(el[i]);
            ssets.push_back(add);
        }
        sets.insert(sets.end(), begin(ssets), end(ssets));
    }
    
//print the subsets
    for (int j = 0 ; j < sets.size() ; j++ ) {
        auto v = sets[j];
        for (auto a : v) {
            cout << a << " ";
        }
        cout << endl;
    }
    cout << "#subsets "<<sets.size() << endl;
}



int main() {
    vector<int> a = {1, 2, 3};
    generateSubset(a);
}