Sunteți pe pagina 1din 2

Rezolvarea unei probleme poate conduce la un obţinerea unui număr foarte mare de soluţii

posibile.
Nu întotdeauna ne interesează toate soluţiile, ci numai o parte dintre ele, care îndeplinesc anumite
condiţii .
În astfel de cazuri este indicată folosirea metodei Backtracking (BKT).Soluţia unei probleme
rezolvate
cu metoda BKT se poate reprezenta sun forma unui vector : S =(s1,s2,s3,...,sn).
Fiecare componentă si a vectorului poate lua valori într-o anumită mulţime Ai unde i=1,2,3,...,n.
Produsul cartezian A1xA2xA3x...xAn se numeşte spaţiul soluţiilor posibile.
GENERAREA SUBMULŢIMILOR UNEI MULŢIMI
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}x {0,1} x...{0,1} de n ori. Această a doua
metodă este eficientă deoarece generează 2n soluţii (=nr. de submulţimi ale unei mulţimi cu n
elemente ). Fiecare element al produsului cartezian reprezintă câte un vector caracteristic al unei
submulțimi din A.
Aşadar, generăm toți vectorii caracteristici xcu n elemente,cu valorile 0 şi 1. Pentru fiecare vector
soluție parcurgem soluţia şi afişăm elementele din mulţimea A cărora le corespund valorile 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ă

EXEMPLU
1. 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} {4}
        {1,2} {1,3} {2,3}{1,4}{2,4}{3,4}
        {1,2,3, 4}

SOLUTIE:
   I. 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
  II. x[k] poate fi 0 sau 1
 III. Valid - nu este necesar

 IMPLEMENTARE

#include<iostream>
using namespace std;

char sp[]="        ";

int x2[20], n2, nrsol2=0;

void Afisare2()
{ int i;
  cout<<sp<<"{ ";
  for(i=1;i<=n;i++)
    if (x[i]==1) cout<<i<<" ";
  cout<<char(8)<<"}"<<endl;
  nrsol++;
  if (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>>n;
  cout<<endl;
  BackRec2(1);
  cout<<endl<<sp2<<"Numar solutii: "<<nrsol2;
  return 0;
}

S-ar putea să vă placă și