Sunteți pe pagina 1din 7

METODA

BACKTRACKING
Generarea submulțimilor
Enunț
Consideram o mulțime cu A cu n elemente. Submulțimile mulțimii A au număr
variabil elemente ale multimii A. Numărul acestor submulțimi generate este. .
Ne propunem să determinăm în ordine lexicografică submulțimile lui A={1, 2, 3, …, n}

Exemplu:
Pentru n=4 numărul submulțimilor este , iar submulțimile sunt:
1
12
123
1234
124
13
134
14
2
23
234
24
3
34
4
Analiza problemei
■ Codificarea/ Cum arată soluția?
– Soluția trebuie să fie sub formă de vector
4
3
1

– Ca orice rezolvare cu algoritmul backtracking, începem prin a


preciza semnificația vectorului soluție. Astfel, x[] reprezintă o
submulțime.
– Deoarece submulțimile au număr variabil de elemente, și
vectorul soluție va avea un număr variabil de elemente.
Analiza problemei
1. Când avem soluție? Modificare funcția soluție Nu mai există funcția soluție, deoarece orice
R: vectorul se completează valoare validă plasată în vectorul soluție
element cu element. conduce la o soluție.
Fiecare variantă a
vectorului soluție
corespunde cu o
submulțime.
Analiza problemei
2, Care sunt mulțimile Modificare funcția Back Ai ={1, 2, 3, …n} (pe fiecare nivel se vor pune
soluțiilor posibile pentru - limitele for-ului elemente de la 1, la n}
fiecare nivel al soluției? A=primul element din void Back(int k)
mulțime, B=ultimul {
R: elemenele vectorului - Nemaifiind functia for(int i = 1 ; i <= n; ++i)
sunt valori între 1 și n; solutie, după verificarea {
condițiilor de validitate, se x[k]=i;
afișează soluția si apoi se if( OK(k) )
merge la nivelul următor. {
Afisare(k);
Back(k+1);
}
}
}
3. Care sunt condițiile de Se modifică funcția ok Deoarece condițiile interne se aplică pentru toate
validitate ale problemei? elementele vectorului soluție, este suficient
R: ca x[k]>x[k-1], pentru k>1
x[k]>x[i], i între 1 și k-1.
bool OK(int k){
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 elementele soluției cout<<x[i]<<‘ ‘;
12 cout<<endl;
123
1234 }
124
13
134
14
2
23
234
24
3
34
4

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