C++ “上的子集集”;";对象

C++ “上的子集集”;";对象,c++,c++11,set,subset,C++,C++11,Set,Subset,假设我有两个元素{a,b}。现在给定一个数字“n”,我想让“n”元素的所有子集的集合都包含所有“n”元素。这里我们可以得到({a}和{b})和({a,b})的子集集。在一个由三个元素组成的集合中,我有所有的子集集,({a},{b},{c})和({a,b},{c})和({a},{b,c})和({a,b},{b})。我怎样才能在C++中编写一个程序,作为一个函数来获取数字“n”,并给出这些子集的所有集合 我不确定我是否非常理解您的问题,但我认为您正在查看分区。 反复思考这个问题。 要对一组n个元素进

假设我有两个元素
{a,b}
。现在给定一个数字“n”,我想让“n”元素的所有子集的集合都包含所有“n”元素。这里我们可以得到
({a}和{b})
({a,b})
的子集集。在一个由三个元素组成的集合中,我有所有的子集集,
({a},{b},{c})
({a,b},{c})
({a},{b,c})
({a,b},{b})
。我怎样才能在
C++
中编写一个程序,作为一个函数来获取数字“n”,并给出这些子集的所有集合

我不确定我是否非常理解您的问题,但我认为您正在查看分区。
反复思考这个问题。
要对一组n个元素进行分区,请运行一个循环,对其所有子集进行迭代。

现在,只需将子集的补码(通过递归找到)的分区附加到当前迭代的子集。

您可以这样做,使用一次查找n个事物的组合的公式

nCr = n! / r! (n-r)!
例如,要找到一组3的所有组合,一次取2个(a,b,c)(a,b)

要查找所有可能的集合,可以使用for循环将r递减为0。根据我对组合数学/置换的记忆,空集{}也被计算在内

这里是这样的,在C++函数中(这是相当基本的)


我还想补充一点,一组n个元素总是有2到n个子集,我需要提取这些子集,而不仅仅是可生产子集的数量。不过在编码方面做得不错
C = 3! / 2! (3-2)!
C = 6 / 2(1)
C = 3 distinct combinations are possible for set (a,b,c) in a subset of 2:
(a,b), (a,c), (b,c)

finding all of them
nCr(where n and r = 3) = 1 set (a,b,c)
nCr(n=3, r=1) = 3 = 3 sets (a),(b),(c)
include empty set {}
C = 8
unsigned int factorial(unsigned int i)
{
    unsigned int sum = 0;

    if (i > 1)
    {
        sum = i;
        --i;
        for (i; i > 1; --i)
            sum *= i;
    }// 1! and 0! are 1
    else 
        return 1;


    return sum;
}

unsigned int allsubsets(unsigned int n)
{
    unsigned int C = 0;
    for (int r = n; r > 0; --r)
    {
        C += ( factorial(n) / ( factorial(r) * factorial(n-r) ) );
    }
    ++C; // include the null set
    return C;   
}

int main()
{
    std::cout << "C of 1 is: " << allsubsets(1) << std::endl;
    std::cout << "C of 2 is: " << allsubsets(2) << std::endl;
    std::cout << "C of 3 is: " << allsubsets(3) << std::endl;
    std::cout << "C of 4 is: " << allsubsets(4) << std::endl;
    std::cout << "C of 5 is: " << allsubsets(5) << std::endl;

    return 0;
}
C of 1 is: 2
C of 2 is: 4
C of 3 is: 8
C of 4 is: 16
C of 5 is: 32