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

Probleme Rezolvate



Manual clasa a Xi a

Tehnici de programare

Metoda backtraking

Să se genereze toate partiţiile mulţimii A formate din submulțimi care au acelaşi număr de elemente.
# include < iostream >
void print_partition ( int A[], int n, int subsets [][ 20 ], int subset_sizes [], int m) {
for ( int i = 0 ; i < m; i++) {
std :: cout << "Submulțimea " << i + 1 << ": " ;
for ( int j = 0 ; j < subset_sizes [i]; j++) {
std :: cout << A[ subsets [i][j]] << " " ;
}
std :: cout << std :: endl ;
}
std :: cout << std :: endl ;
}
bool is_valid ( int subset_sizes [], int m) {
for ( int i = 1 ; i < m; i++) {
if ( subset_sizes [i] != subset_sizes [i - 1 ]) {
return false ;
}
}
return true ;
}
void partition_helper ( int A[], int n, int subsets [][ 20 ], int subset_sizes [], int m, int idx ) {
if ( idx == n) {
if ( is_valid ( subset_sizes , m)) {
print_partition (A, n, subsets , subset_sizes , m);
}
return ;
}
for ( int i = 0 ; i < m; i++) {
subsets [i][ subset_sizes [i]] = idx ;
subset_sizes [i]++;
partition_helper (A, n, subsets , subset_sizes , m, idx + 1 );
subset_sizes [i]--;
}
}
void partition ( int A[], int n, int m) {
int subsets [m][ 20 ], subset_sizes [m] = { 0 };
partition_helper (A, n, subsets , subset_sizes , m, 0 );
}
int main () {
int n, m;
std :: cout << " Introduceti numarul de elemente: " ;
std ::cin >> n;
int A[n];
std :: cout << " Introduceti elementele: " ;
for ( int i = 0 ; i < n; i++) {
std ::cin >> A[i];
}
std :: cout << " Introduceti numarul de submulțimi: " ;
std ::cin >> m;
partition (A, n, m);
return 0 ;
}