Sunteți pe pagina 1din 17

Probleme Combinatoriale

Marius Popescu, Bogdan Alexe


popescunmarius@gmail.com, bogdan.alexe@fmi.unibuc.ro
Universitatea din Bucuresti
Facultatea de Matematica si Informatica

11 Mai, 2019

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 1 / 13


Permutari Aranjamente Combinari

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);
}
}

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 2 / 13


Permutari Aranjamente Combinari

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 ;
}

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 3 / 13


Permutari Aranjamente Combinari

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 ;
}

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 4 / 13


Permutari Aranjamente Combinari

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 ] ; }
}

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 5 / 13


Permutari Aranjamente Combinari

Generarea Permutarilor cu Repetitie

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:

(1 2 2 3), (1 2 3 2), (1 3 2 2), (2 1 2 3),


(2 1 3 2), (2 2 1 3), (2 2 3 1), (2 3 1 2),
(2 3 2 1), (3 1 2 2), (3 2 1 2), (3 2 2 1)

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 6 / 13


Permutari Aranjamente Combinari

Generarea Permutarilor cu Repetitie

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 ] ;
}

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 7 / 13


O problema de concurs

Problema ACM 1994

Se considera un sir de caractere citit de la tastatura. Sa se determine


numarul de ordine al acestui sir in multimea de siruri obtinute prin
permutarea sa, considerata ca fiind ordonata lexicografic. Sirul poate
contine si caractere care se repeta. Spre exemplu, daca sirul citit este
ccbd, multimea tuturor sirurilor obtinute prin permutarea caracterelor
acestui sir, ordonata lexicografic, este:

bccd, bcdc, bdcc, cbcd, cbdc, ccbd,


ccdb, cdbc, cdcb, dbcc, dcbc, dccb

deci numarul de ordine corespunzator sirului dat este 6.

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 8 / 13


O problema de concurs

Permutari cu repetitie

Fie s un sir de lungime n ce contine caracterele distincte:


a1 < a2 < ... < am , ai aparand de ki ori in s (evident
k1 + k2 + ... + km = n).
Numarul permutarilor distincte ce se pot obtine din s este:

n! (k1 + k2 + ... + km )!
=
k1 ! · k2 ! · ... · km ! k1 ! · k2 ! · ... · km !
notam acest numar cu (k1 , k2 , ..., km )

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 9 / 13


O problema de concurs

Solutia

Numarul de ordine al sirului s se va gasi in intervalul:

[1, (k1 , k2 , ..., km )]

Ideea determinarii acestui numar consta in examinarea caracterelor lui


s de la stanga la dreapta si restrangerea acestui interval dupa fiecare
examinare in parte.

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 10 / 13


O problema de concurs

Solutia

Fie ai x un sir care incepe cu


caracterul ai si al carui numar de Exemplu
ordine se afla in intervalul [B, E ].
ccbd = a2 a2 a1 a3
Dupa examinarea lui ai acest interval
a2 a2 a1 a3 (1, 2, 1) [1, 12]
se poate restrange la [B 0 , E 0 ] unde:
a2 a1 a3 (1, 1, 1) [4, 9]
B 0 = B + ((k1 − 1), k2 , ..., km )+ a1 a3 (1, 0, 1) [6, 7] a3 (0, 0, 1) [6, 6]

(k1 , (k2 − 1), ..., km ) + ...


(k1 , ..., (ki−1 − 1), ...km )
0 0
E = B + (k1 , ..., (ki − 1), ..., km ) − 1

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 11 / 13


O problema de concurs

Solutia

Fie ai x un sir care incepe cu


caracterul ai si al carui numar de Exemplu
ordine se afla in intervalul [B, E ].
ccbd = a2 a2 a1 a3
Dupa examinarea lui ai acest interval
a2 a2 a1 a3 (1, 2, 1) [1, 12]
se poate restrange la [B 0 , E 0 ] unde:
a2 a1 a3 (1, 1, 1) [4, 9]
B 0 = B + ((k1 − 1), k2 , ..., km )+ a1 a3 (1, 0, 1) [6, 7] a3 (0, 0, 1) [6, 6]

(k1 , (k2 − 1), ..., km ) + ...


(k1 , ..., (ki−1 − 1), ...km )
0 0
E = B + (k1 , ..., (ki − 1), ..., km ) − 1

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 11 / 13


O problema de concurs

Solutia

Fie ai x un sir care incepe cu


caracterul ai si al carui numar de Exemplu
ordine se afla in intervalul [B, E ].
ccbd = a2 a2 a1 a3
Dupa examinarea lui ai acest interval
a2 a2 a1 a3 (1, 2, 1) [1, 12]
se poate restrange la [B 0 , E 0 ] unde:
a2 a1 a3 (1, 1, 1) [4, 9]
B 0 = B + ((k1 − 1), k2 , ..., km )+ a1 a3 (1, 0, 1) [6, 7] a3 (0, 0, 1) [6, 6]

(k1 , (k2 − 1), ..., km ) + ...


(k1 , ..., (ki−1 − 1), ...km )
0 0
E = B + (k1 , ..., (ki − 1), ..., km ) − 1

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 11 / 13


O problema de concurs

Solutia

Fie ai x un sir care incepe cu


caracterul ai si al carui numar de Exemplu
ordine se afla in intervalul [B, E ].
ccbd = a2 a2 a1 a3
Dupa examinarea lui ai acest interval
a2 a2 a1 a3 (1, 2, 1) [1, 12]
se poate restrange la [B 0 , E 0 ] unde:
a2 a1 a3 (1, 1, 1) [4, 9]
B 0 = B + ((k1 − 1), k2 , ..., km )+ a1 a3 (1, 0, 1) [6, 7] a3 (0, 0, 1) [6, 6]

(k1 , (k2 − 1), ..., km ) + ...


(k1 , ..., (ki−1 − 1), ...km )
0 0
E = B + (k1 , ..., (ki − 1), ..., km ) − 1

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 11 / 13


O problema de concurs

Solutia

Fie ai x un sir care incepe cu


caracterul ai si al carui numar de Exemplu
ordine se afla in intervalul [B, E ].
ccbd = a2 a2 a1 a3
Dupa examinarea lui ai acest interval
a2 a2 a1 a3 (1, 2, 1) [1, 12]
se poate restrange la [B 0 , E 0 ] unde:
a2 a1 a3 (1, 1, 1) [4, 9]
B 0 = B + ((k1 − 1), k2 , ..., km )+ a1 a3 (1, 0, 1) [6, 7] a3 (0, 0, 1) [6, 6]

(k1 , (k2 − 1), ..., km ) + ...


(k1 , ..., (ki−1 − 1), ...km )
0 0
E = B + (k1 , ..., (ki − 1), ..., km ) − 1

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 11 / 13


Alte Probleme

Alte Probleme

Probleme Combinatoriale
Generarea submultimilor unei multimi.
Generarea partitiilor unei multimi.
Descompunerea unui intreg pozitiv ca suma de intregi pozitivi.

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 12 / 13


Problema Admitere 2011

Problema Admitere 2011

Se da un vector v de n elemente egale cu 1. Prin partitie a vectorului v


intelegem o impartire a vectorului in subvectori, astfel incat fiecare element
al vectorului v apare exact o data intr-unul dintre subvectori. Pentru
fiecare partitie a vectorului v in k subvectori v11 , . . . , v1n1 , v21 , . . . , v2n2 ,
. . . , vk1 , . . . , vknk , se calculeaza
Qn produsul sumelor elementelor din fiecare
subvector al partitiei, adica i=1 ni .

a) Sa se scrie un program care determina cel mai mare produs calculat in


acest fel pentru toate partitiile posibile ale vectorului v.
b) Exista o solutie la punctul a) care sa nu calculeze toate produsele
posibile? Justificati.

M. Popescu, B. Alexe (UNIBUC) Probleme Combinatoriale 11 Mai, 2019 13 / 13