2011-10-14 26 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 != {}

相關問題