Sunteți pe pagina 1din 2

Generarea tuturor partiţiilor mulţimii {1, 2, ...

, n}

Definiţie. Fie mulţimea A={1,2,...,n}. Se numeşte partiţie a mulţimii A, un set de k≤n mulţimi care
îndeplinesc condiţiile de mai jos:
a) A1∪A2∪...∪Ak=A;
b) Ai∩Aj=∅, ∀i≠j∈{1,2...n}.
Exemplu. Considerăm mulţimea A={1,2,3}. Avem partiţiile:
{1,2,3}
{1,2} {3}
{1,3} {2}
{2,3} {1}
{1} {2} {3}
Enunţ. Se citeşte un număr natural, n. Se cer toate partiţiile mulţimii A={1,2,...,n}.
Rezolvare. Chiar dacă ştim să generăm toate submulţimile unei mulţimi, tot nu ne ajută să
generăm toate partiţiile.
1. Pentru a putea genera toate partiţiile, trebuie să găsim o metodă prin care să putem reţine o partiţie.
O primă idee ne conduce la folosirea unui vector, x, astfel: dacă x[i]=k, atunci elementul i se găseşte
în mulţimea k a partiţiei. Totuşi, nu ştim câte mulţimi sunt în partiţia respectivă. Există o partiţie care
conţine n mulţimi atunci când fiecare element este într-o mulţime şi una care conţine toate mulţimile,
adică tocmai mulţimea A. Cu alte cuvinte, numărul mulţimilor dintr-o partiţie este între 1 şi n.
2. Pentru a avea o ordine în generarea soluţiilor, elementele mulţimii A trebuie să aparţină de
submulţimi consecutive ale partiţiei.
Din acest motiv, x[i] va lua valori între 1 şi 1+max{x[1], x[2], ..., x[i-1]}. Prin
această condiţie se evită situaţia în care, de exemplu, vectorul x reţine (1,3,1). Aceasta ar avea
semnificaţia că elementele 1 şi 3 se găsesc în submulţimea 1 a partiţiei, iar elementul 2 se găseşte în
submulţimea 3 a partiţiei. În acest caz, lipseşte submulţimea 2 a partiţiei.
Să exemplificăm funcţionarea algoritmului pentru cazul n=3:
- x =(1,1,1) - A1={1,2,3);
- x =(1,1,2) - A1={1,2} A2={3};
- x =(1,2,1) - A1={1,3} A2={2};
- x =(1,2,2) - A1={1} A2={2,3};
- x =(1,2,3) - A1={1} A2={2} A3={3}.

//partitiile unei multimi


#include <fstream>
using namespace std;
int x[10], n;
ifstream f("partitiimultime.in");
ofstream g("partitiimultime.out");

int maxim(int k)
{
int i, t = 0;
for(i = 1; i < k; i ++)
t = max(x[i], t);
return t;
}
void scrie()
{
int i, t, j;
t = maxim(n + 1);
for(i = 1; i <= t; i ++)
{
for(j = 1; j <= n; j ++)
if(x[j] == i) g << j;
g << "*";
}
g << "\n";
}

void back(int k)
{
for(int i = 1; i <= maxim(k) + 1; i ++)
{
x[k] = i;
if(k == n) scrie();
else back(k + 1);
}
}

int main()
{
f >> n;
x[1] = 1;
back(2);
return 0;
}