online: 5; azi: 467; total: 50922 Manual clasa a xi a - Tehnici de programare - Metoda backtraking

Probleme Rezolvate



Manual clasa a Xi a

Tehnici de programare

Metoda backtraking

Într-un restaurant, un meniu este format din trei feluri de mâncare. Există patru preparate culinare pentru felul unu, cinci preparate culinare pentru felul doi şi trei preparate culinare pentru felul 3. Fiecare preparat culinar are un preţ şi un număr de calorii. Să se genereze toate meniurile pe care le poate comanda o persoană, care să nu depăşească suma s şi numărul de calorii c. Datele se citesc dintr-un fişier text, astfel: de pe primul rând suma s şi numărul de calorii, de pe rândul următor, în ordine, prețul fiecărui preparat culinar, şi de pe ultimul rând, în aceeaşi ordine, caloriile fiecărui preparat culinar.
# include < iostream >
# include < fstream >
using namespace std ;
typedef int stiva[ 100 ];
int n; // numarul de feluri de mancare
int s; // suma maxima permisa
int c; // numarul maxim de calorii permis
int pret [ 100 ]; // vectorul de preturi
int calorii[ 100 ]; // vectorul de calorii
stiva st; // stiva de selectie
// initializare stiva
void init ( int k) {
st[k] = 0 ;
}
// functia de generare a succesorilor
int succesor ( int k) {
if (st[k] < 1 ) {
st[k]++;
return 1 ;
} else {
return 0 ;
}
}
// functia de verificare a solutiei
int solutie ( int k) {
return k == 3 ;
}
// functia de verificare a validitatii solutiei partiale
int valid ( int k, int s, int c, int * pret , int * calorii) {
int sum = 0 , cal = 0 ;
for ( int i = 1 ; i <= k; i++) {
if (st[i] == 1 ) {
sum += pret [i];
cal += calorii[i];
}
}
return sum <= s && cal <= c;
}
// functia de afisare a solutiei
void tipar ( int * pret ) {
cout << "Meniu: " ;
int x = 0 ;
for ( int i = 1 ; i <= n; i++) {
if (st[i] == 1 ) {
if (x > 0 ) {
cout << ", " ;
}
cout << "felul " << i << " (" << pret [i] << " lei)" ;
x++;
}
}
cout << endl ;
}
// functia de backtracking
void bt ( int k) {
init (k);
while ( succesor (k)) {
if ( valid (k, s, c, pret , calorii)) {
if ( solutie (k)) {
tipar ( pret );
} else {
bt (k+ 1 );
}
}
}
}
int main () {
ifstream fin ( "meniu.in" ) ;
fin >> s >> c >> n;
for ( int i = 1 ; i <= n; i++) {
fin >> pret [i];
}
for ( int i = 1 ; i <= n; i++) {
fin >> calorii[i];
}
fin. close ();
bt ( 1 );
return 0 ;
}

Acest program citește datele de intrare din fișierul meniu.in , inițializează stiva și celelalte variabile și apoi apelează funcția bt pentru a genera toate meniurile valide.
Pentru a rula programul, trebuie să creați fișierul de intrare meniu.in și să introduceți datele de intrare în el în formatul specificat în enunțul problemei:
s c n
p1 p2 ... pn
c1 c2 ... cn
Unde s este suma maximă permisă, c este numărul maxim de calorii permis, n este numărul