Documente Academic
Documente Profesional
Documente Cultură
11 Mai, 2019
Backtracking (memento)
v o i d back ( i n t ∗ s t , i n t k ) {
i f ( ! e v a l i d ( st , k )) return ;
i f ( e s o l ( st , k )) {
t i p a r s o l ( st , k ) ;
return ;
}
i n i t ( st , k ) ;
while ( s u c c e s o r ( st , k )) {
back ( s t , k +1);
}
}
Generarea Permutarilor
init succesor
void i n i t ( i n t ∗ st , i n t k ) { bool s u c c e s o r ( i n t ∗ st , i n t k ) {
s t [ k ] = −1; r e t u r n ++s t [ k ] < n ;
} }
evalid esol
bool e v a l i d ( i n t ∗ st , i n t k ) { bool e s o l ( i n t ∗ st , i n t k ) {
f o r ( i n t i = 0 ; i < k −1; i ++) r e t u r n k == n ;
i f ( s t [ k −1] == s t [ i ] ) }
return f a l s e ;
return true ;
}
Generarea Aranjamentelor
init succesor
void i n i t ( i n t ∗ st , i n t k ) { bool s u c c e s o r ( i n t ∗ st , i n t k ) {
s t [ k ] = −1; r e t u r n ++s t [ k ] < n ;
} }
evalid esol
bool e v a l i d ( i n t ∗ st , i n t k ) { bool e s o l ( i n t ∗ st , i n t k ) {
f o r ( i n t i = 0 ; i < k −1; i ++) r e t u r n k == m;
i f ( s t [ k −1] == s t [ i ] ) }
return f a l s e ;
return true ;
}
Generarea Combinarilor
init succesor
void i n i t ( i n t ∗ st , i n t k ) { bool s u c c e s o r ( i n t ∗ st , i n t k ) {
s t [ k ] = −1; r e t u r n ++s t [ k ] < n ;
} }
evalid esol
bool e v a l i d ( i n t ∗ st , i n t k ) { bool e s o l ( i n t ∗ st , i n t k ) {
i f ( k < 2) return true ; r e t u r n k == m;
r e t u r n s t [ k −1] > s t [ k − 2 ] ; }
}
Acelasi numar (obiect) poate aparea de mai multe ori intr-o permutare cu
repetitie in functie de multiplicitatea sa.
Consideram n = 3 si numerele 1, 2, 3 cu multiplicitatile 1, 2, 1. Obtinem
permutarile cu repetitie de lungime 4 urmatoare:
init succesor
void i n i t ( i n t ∗ st , i n t k ) { bool s u c c e s o r ( i n t ∗ st , i n t k ) {
s t [ k ] = −1; r e t u r n ++s t [ k ] < n ;
} }
evalid esol
bool e v a l i d ( i n t ∗ st , i n t k ) { bool e s o l ( i n t ∗ st , i n t k ) {
i f ( k == 0 ) r e t u r n t r u e ; r e t u r n k == t o t a l ;
i n t l a s t = s t [ k −1]; }
i n t count = 1;
f o r ( i n t i = 0 ; i < k −1; i ++)
i f ( l a s t == s t [ i ] ) c o u n t ++;
r e t u r n c o u n t <= f r e c v e n t a [ l a s t ] ;
}
Permutari cu repetitie
n! (k1 + k2 + ... + km )!
=
k1 ! · k2 ! · ... · km ! k1 ! · k2 ! · ... · km !
notam acest numar cu (k1 , k2 , ..., km )
Solutia
Solutia
Solutia
Solutia
Solutia
Solutia
Alte Probleme
Probleme Combinatoriale
Generarea submultimilor unei multimi.
Generarea partitiilor unei multimi.
Descompunerea unui intreg pozitiv ca suma de intregi pozitivi.