You are on page 1of 7

METODA

BACKTRACKING
Generarea combinărilor
Enunț
Consideram o mulțime cu A cu n elemente. Prin combinări
de k elemente din A înțelegem submulțimile cu p elemente ale multimii A. Numărul
acestor combinări este. .
Ne propunem să determinăm în ordine lexicografică combinările de p ale mulțimii A={1,
2, 3, …, n}

Exemplu:
Pentru n=4 si p=3 numărul combinărilor este = =4, iar combinările sunt:
123
124
134
234
Analiza problemei
■ Codificarea/ Cum arată soluția?
– Soluția trebuie să fie sub formă de vector

4
3
2

– Ca orice rezolvare cu algoritmul backtracking, începem prin


a preciza semnificația vectorului soluție. Astfel, x[]
reprezintă o combinare.
Analiza problemei
1. Care sunt mulțimile Modificare funcția Back Ai ={1, 2, 3, …n} (pe fiecare nivel se vor pune
soluțiilor posibile limitele for-ului A=primul elemente de la 1, la n}
pentru fiecare nivel al element din mulțime, void Back(int k){
soluției? B=ultimul for(int i = 1 ; i <= n; ++i)
R: elemenele vectorului {
sunt valori între 1 și n; x[k]=i;
if( OK(k) )
if(Solutie(k))
Afisare(k);
else
Back(k+1);
}
}
2. Când avem soluție? Modificare funcția soluție Când stiva este plină (k==p) avem soluție
R: vectorul se completează int Solutie(int k){
element cu element. Când return (k==p)
va avea p elemente, }
reprezintă o combinare
completă, care urmează a fi
afișată.
3. Care sunt condițiile de Se modifică funcția ok Când adăugăm un element în stivă, trebuie
validitate ale problemei? -elementele să nu se repete (adică x[i] ≠x[k],
pentru orice i<k)
- elementele să fie ordonate crescător (x[k-1]
<x[k]),
int OK(int k){
for(int i=1; i:=k-1; i++)
if(x[k]==x[i] )
return 0;
if(k>1)
if(x[k]<=x[k-1] )
return 0;
return 1;}
Cum arată soluția? Se modifică funcția void Afisare(int k)
În vectorul x(stivă) se vor Afisare astfel încăt să {
genera sub forma tipărească toate for(int i=1; i:=k; i++)
1, 2, 3 elementele soluției cout<<x[i]<<‘ ‘;
1, 2, 4 cout<<endl;
1, 3, 4
2, 3, 4 }

You might also like