Documente Academic
Documente Profesional
Documente Cultură
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)
IMPLEMENTARE
#include<iostream>
using namespace std;
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;
}