online: 2; azi: 740; total: 51195 Manual clasa a xi a - Tehnici de programare - Metoda backtraking

Probleme Rezolvate



Manual clasa a Xi a

Tehnici de programare

Metoda backtraking

O bară are lungimea L. Se consideră n repere de lungimi diferite. Să se genereze toate posibilităţile de a tăia bara după reperele existente, fără să rămână rest la tăiere, fiecare reper fiind folosit cel puţin o dată. Se citesc dintr-un fişier text, de pe primul rând, lungimea barei — L şi numărul de repere — n, iar de pe următorul rând, reperele. Numerele de pe un rând sunt separate prin spațiu.
# include <iostream>
# include <fstream>
using namespace std ;
const int MAX_N = 100 ;
int L, n;
int reps[MAX_N];
bool used[MAX_N];
int sections[MAX_N];
int count = 0 ;
void generateCuts ( int pos, int start, int len) {
if (len == L) {
cout << "Solution " << ++count << ": " ;
for ( int i = 0 ; i < pos; i++) {
cout << sections[i] << " " ;
}
cout << endl ;
return ;
}
for ( int i = start; i < n; i++) {
if (!used[i] && len + reps[i] <= L) {
used[i] = true ;
sections[pos] = reps[i];
generateCuts(pos+ 1 , i+ 1 , len+reps[i]);
used[i] = false ;
}
}
}
int main () {
ifstream fin ( "input.txt" ) ;
fin >> L >> n;
for ( int i = 0 ; i < n; i++) {
fin >> reps[i];
}
fin.close();
generateCuts( 0 , 0 , 0 );
return 0 ;
}

E xemplu de fișier:
10 4
2 3 5 8