sâmbătă, 3 decembrie 2011

Partitiile unei multimi

#include <fstream>
#include <iostream>
using namespace std;

int n;                    //numarul de elemente din multime
int nc;                   //numarul de clase
int P[30];                //partitia
int NrP;                  //numarul de partitii
ofstream fout("part.out");//fisierul de iesire
void Afisare()
{ fout<<"Partitia "<<++NrP<<": ";
for (int j=1; j<=nc; j++)//afisez clasa nr. j
{fout<<" { ";
for (int i=1; i<=n; i++)
if (P[i]==j) fout<<i<<' ';
fout<<'}';}
fout<<endl; }
void GenPartitie(int k)
{/*cand apelam GenPartitie(k), in vectorul P pe primele k-1
pozitii se afla o partitie a multimii 1,2,...,k-1
formata din NC clase */
if (k-1==n) Afisare();  //partitia este complet construita
else
{//plasam elementul k in una din clasele existente
for (int j=1; j<=nc; j++)
{P[k]=j;
GenPartitie(k+1);}
//sau elementul k reprezinta o clasa separata
nc++;              //maresc numarul de clase
P[k]=nc;
GenPartitie(k+1);
nc--; }            //restaurez numarul de clase
}
int main()
{cout<<"n= "; cin>>n;
GenPartitie(1);
fout.close(); return 0; }

Niciun comentariu:

Trimiteți un comentariu