如何在C ++中生成给定数组的子集?

时间:2011-10-14 15:16:03

标签: c++ vector subset

我想生成一组数字n = 0, 1, 2, ...的子集 不应该重复使用不同顺序的相同数字,例如2-3-4 = 3-2-4 = 4-2-3 = 4-3-2

e.g。

vector<unsigned int> list = {2,4,6,8,9}

所以子集就像,

n=0 {}

n=1 {2}{4}{6}{8}{9}

n=2 {2,4}{2,6}{2,8}{2,9}{4,6}{4,8}{4,9}{6,8}{6,9}{8,9}

3 个答案:

答案 0 :(得分:3)

生成长度等于您的数字的所有二进制数。

3 numbers:
000
001
010
011
100
101
110
111

接下来根据位置选择数字并将它们映射到相应的集合(例如,如果是001,则将其映射为1,对于101,您将其映射到3)。

对于初始集{1,2,3}:

{}      ->0
{3}     ->1
{2}     ->1
{2,3}   ->2
{1}     ->1
{1,3}   ->2
{1,2}   ->2
{1,2,3} ->3

我只是给你一个想法,因为这似乎是家庭作业,这不是一个功课解决网站。这应该给你一个起点。

答案 1 :(得分:1)

大多数算法的工作原理是生成所有可能的子集,然后选择你想要的子集[这里是它的长度]。

您可以使用的一个想法是递归。抽象,所以你做功课。

考虑一个给定的集合G = {1,2,3},您必须为其找到子集。

保持一组Y = { {} }开头。

Step 1 : 1 may or may not be there . Y = { {1} , {} } . G = {2,3}

Step 2 : 2 may or may not be there . Y = { {1,2} , {2} , {1} , {} } . G = {3} .

答案直到G != {}

答案 2 :(得分:0)

对于子集,规则是

  

“至少有两个子集:null和集合本身。所有子集   count总是= 2 ^(n),其中n是元素的数量   集“。

您可以使用recurisve-backtracking来解决此问题。