2011-10-14 23 views
1

我想生成一组数字的大小为n = 0, 1, 2, ...的子集。
不应该用不同顺序重复相同的数字,如2-3-4 = 3-2-4 = 4-2-3 = 4-3-2如何在C++中生成给定数组的子集?

例如,

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} 
+2

我敢打赌,这是一门功课。 –

+0

这里有一个类似的问题:http://stackoverflow.com/questions/127704/algorithm-to-return-all-combinations-of-k-elements-from-n –

+1

你到目前为止有什么? – Nim

回答

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 

我只是给你一个想法,因为这看起来像功课,这不是解决家庭作业现场。这应该给你一个起点。

+0

我正要争辩说,这对大'n'不能很好地扩展,但是随后意识到如果'n'变大,计算机上没有足够的空间来生成所有答案。所以没关系。 –

0

对于子集,该规则是

“有至少两个子集:空和设定自身的所有子集 计数总是= 2 ^(N),其中n是数。 集中的元素“。

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

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 != {}

相关问题