Generarea submultimilor
Generarea submulţimilor unei mulţimi A cu n elemente se poate face cu ajutorul algoritmului de generare a combinărilor, apelându-l repetat cu valorile 1, 2, …, n pentru a genera submulţimile cu un element, apoi cele cu două elemente, apoi cu 3 elemente etc.
Această modalitate de rezolvare este şi mai complicată şi mai puţin eficientă decât următoarea, care se bazează pe generarea produsului cartezian {0,1}n. Această a doua metodă este eficientă deoarece generează 2n soluţii, adică exact atâtea câte submulţimi are o mulţime cu n elemente.
Aşadar, generăm toate combinaţiile de lungime n cu valorile 0 şi 1. Pentru fiecare combinaţie parcurgem soluţia X şi afişăm elementele din mulţimea A cărora le corespund valori 1 în X. Astfel, pentru combinaţia 001011 vom afişa elementele de pe poziţiile 3, 5 şi 6 din mulţimea iniţială.
ENUNT: Fie n numar natural nenul. Scrieti un program de generare a tuturor submultimilor multimii {1, 2, 3,..., n}.
EXEMPLU: Pentru n=3 programul va genera
{} {1} {2} {3} {1,2} {1,3} {2,3} {1,2,3}
SOLUTIE:
Solutia x[1]......x[n] - x[i] poate fi 0 (i nu apartine submultii) sau 1 (i apartine submultimii)
Solutia Codificare
{} 0 0 0
{3} 0 0 1
{2} 0 1 0
{2,3} 0 1 1
{1} 1 0 0
{1,3} 1 0 1
{1,2} 1 1 0
{1,2,3} 1 1 1
x[k] poate fi 0 sau 1
Valid - nu este necesar
PROGRAM C++:
#include <iostream>
using namespace std;
char sp2[]=" ";
int x2[20], n2, nrsol2=0;
void Afisare2()
{ int i;
cout<<sp2<<"{ ";
for(i=1;i<=n2;i++)
if (x2[i]==1) cout<<i<<" ";
cout<<char(8)<<"}"<<endl;
nrsol2++;
}
void BackRec2(int k)
{ int i;
for(i=0;i<=1;i++)
{ x2[k]=i;
if (k==n2) Afisare2();
else BackRec2(k+1);
}
}
int main()
{ cout<<endl<<endl<<sp2<<"Submultimile multimii {1,2,3.....,n}"<<endl;
cout<<endl<<sp2<<" Dati valoarea lui n: "; cin>>n2;
cout<<endl;
BackRec2(1);
cout<<endl<<sp2<<"Numar solutii: "<<nrsol2;
return 0;
}