online: 4; azi: 652; total: 51107 Manual clasa a xi a - Tehnici de programare - Metoda backtraking

Probleme Rezolvate



Manual clasa a Xi a

Tehnici de programare

Metoda backtraking

Să se rezolve în mulţimea numerelor naturale ecuația 4x+3y+2xy=48. Indicație. Soluţia are 2 elemente: x şi y. Ele pot lua valori în intervalul [0,16]. Limita inferioară a intervalului este 0, pentru că numerele sunt naturale. Limita superioară s-a determinat considerând, pe rând, situațiile limită x=0 şi y=0. Considerăm mulțimea A={0,2,3,..., 16). Problema se reduce la generarea produsului cartezian cu condiție AxA - soluția conţine o condiţie internă suplimentară: elementele ei trebuie să verifice ecuația.
# include < iostream >
using namespace std ;
int n = 2 ; // numarul de elemente (x si y)
int a[ 17 ]; // vectorul de elemente (numerele naturale de la 0 la 16)
int sol[ 100 ]; // soluția curentă (x și y)
// functia de verificare a solutiei
bool solutie () {
return 4 * sol[ 0 ] + 3 * sol[ 1 ] + 2 * sol[ 0 ] * sol[ 1 ] == 48 ;
}
// functia de afisare a solutiei
void tipar () {
cout << "(" << sol[ 0 ] << ", " << sol[ 1 ] << ")" << endl ;
}
// functia de backtracking
void bt ( int k) {
if (k == n) {
if ( solutie ()) {
tipar ();
}
} else {
for ( int i = 0 ; i <= 16 ; ++i) {
sol[k] = a[i];
bt (k + 1 );
}
}
}
int main () {
// se umple vectorul 'a' cu numerele naturale de la 0 la 16
for ( int i = 0 ; i <= 16 ; i++) {
a[i] = i;
}
// apelul functiei de backtracking
bt ( 0 );
return 0 ;
}