online: 17; azi: 1140; total: 51595 Manual clasa a xi a - Tehnici de programare - Metoda backtraking

Probleme Rezolvate



Manual clasa a Xi a

Tehnici de programare

Metoda backtraking

Profesorul de informatică a pregătit m teme, pentru proiecte pe care trebuie să le repartizeze celor n elevi din clasă (m<=n), astfel încât nici o temă de proiect să nu rămână nerepartizată. Să se genereze toate soluțiile de repartizare a temelor pentru proiect.
Pentru a genera toate soluțiile de repartizare a temelor pentru proiect putem folosi o soluție de tip backtracking . Ideea constă în a parcurge toate combinațiile posibile de alegere a temelor pentru fiecare elev.
Pseudocodul algoritmului ar putea fi următorul:
Exemplu de cod C++:
# include < iostream >
using namespace std ;
const int MAX_N = 100 ;
int n, m;
int temas [MAX_N];
bool used [MAX_N];
void generateSolutions ( int k) {
if (k == n) {
// am gasit o solutie
for ( int i = 0 ; i < n; i++) {
cout << "Elevul " << i+ 1 << " are tema " << temas [i] << endl ;
}
cout << endl ;
return ;
}
for ( int i = 1 ; i <= m; i++) {
if (! used [i]) {
temas [k] = i;
used [i] = true ;
generateSolutions (k+ 1 );
used [i] = false ;
}
}
}
int main () {
cin >> n >> m;
generateSolutions ( 0 );
return 0 ;
}

În acest exemplu, repartizarea temelor este reprezentată printr-un vector temas , iar pentru a verifica dacă o temă a fost deja repartizată altui elev folosim un vector used . Algoritmul începe cu primul elev și încă nu i se repartizează nicio temă, așa că parametrul k inițial este 0. Pentru fiecare elev, încercăm să îi repartizăm o temă care nu a fost deja repartizată altora, parcurgând temele posibile cu ajutorul variabilei i .