Sunteți pe pagina 1din 53

Combinatoric

prof. Zoltan Szabo


Parti[ionarea unui numr
Pregatirea lotului national de informatica juniori
Iasi, 2008
Parti|ionarea unui numr
Tipuri de probleme
Probleme de generare
Numrul parti[ionrilor
Numrul de ordine al unei configura[ii n
mul[imea ordonat a solu[iilor
Parti|ionare fr restric|ii
Probleme de generare 1
Problema 1. (Parti|ionare fr restric|ii)
Dndu-se un numr natural n, s se
descompun n toate modurile posibile ca
sum de numere naturale nenule nu
neaprat distincte.
Parti|ionare fr restric|ii
Probleme de generare 1
Exemplu
n=4
1+1+1+1
1+1+2
1+2+1
1+3
2+1+1
2+2
3+1
4
Subprogram parti[ionare1(st:stiv,k,s,n:natural)
{ dac n=s atunci
tiprete (st,k)
altfel
pentru i1, n-s execut
{ st(k+1) i;
parti[ionare1(st,k+1,s+i,n)
}
}
Parti|ionare fr restric|ii
Probleme de generare 1
Apel: parti[ionare1(st,0,0,n)
Parti|ionare fr restric|ii
Probleme de generare 1
Exerci|iu
Genera[i toate descompunerile fr restric[ii n
ordine lexicografic a numrului n=5
Parti|ionare fr restric|ii
Probleme de generare 1
Solu|ie
1+1+1+1+1
1+1+1+2
1+1+2+1
1+1+3
1+2+1+1
1+2+2
1+3+1
1+4
2+1+1+1
2+1+2
2+2+1
2+3
3+1+1
3+2
4+1
5
Parti|ionare cresctoare
Probleme de generare 2
Problema 2. (Parti|ionare cresctoare)
Dndu-se un numr natural n, s se
descompun n toate modurile posibile ca
sum de numere naturale nenule nu
neaprat distincte aranjate cresctor.
Parti|ionare cresctoare
Probleme de generare 2
Exemplu
n=4
1+1+1+1
1+1+2
1+3
2+2
4
Subprogram parti[ionare2(st:stiv,k,s,n:natural)
{ dac n=s atunci
tiprete (st,k)
altfel
pentru ist(k), n-s execut
{ st(k+1) i;
parti[ionare2(st,k+1,s+i,n)
}
}
Parti|ionare cresctoare
Probleme de generare 2
Apel: st(0) 1;
parti[ionare2(st,0,0,n)
Parti|ionare cresctoare
Probleme de generare 2
Exerci|iu
Genera[i toate descompunerile cresctoare n
ordine lexicografic a numrului n=5
Parti|ionare cresctoare
Probleme de generare 2
Solu|ie
1+1+1+1+1
1+1+1+2
1+1+3
1+2+2
1+4
2+3
5
Parti|ionare strict cresctoare
Probleme de generare 3
Problema 3. (Parti|ionare strict cresctoare)
Dndu-se un numr natural n, s se
descompun n toate modurile posibile ca sum
de numere naturale distincte aranjate
cresctor.
Parti|ionare strict cresctoare
Probleme de generare 3
Exemplu
n=4
1+3
4
Subprogram parti[ionare3(st:stiv,k,s,n:natural)
{ dac n=s atunci
tiprete (st,k)
altfel
pentru ist(k)+1, n-s execut
{ st(k+1) i;
parti[ionare3(st,k+1,s+i,n)
}
}
Parti|ionare strict cresctoare
Probleme de generare 3
Apel: st(0) 0;
parti[ionare2(st,0,0,n)
Parti|ionare strict cresctoare
Probleme de generare 3
Exerci|iu
Genera[i toate descompunerile strict
cresctoare n ordine lexicografic a
numrului n=5
Parti|ionare strict cresctoare
Probleme de generare 3
Solu|ie
1+4
2+3
5
Parti|ionare special
Probleme de generare 4
Problema 4.
(Parti|ionare cu elementele unui ir)
Dndu-se un numr natural n, s se
descompun n toate modurile posibile ca
sum de p numere naturale: a
1
, a
2
,, a
p
, .
Parti|ionare special
Probleme de generare 4
Exemplu
n=5
p=2 a=(1,2)
1+1+1+1+1
1+1+1+2
1+1+2+1
1+2+1+1
1+2+2
2+1+1+1
2+1+2
2+2+1
Subprogram parti[ionare4(st:stiv,k,s,n:natural)
{ dac s=n atunci
tiprete (st,k)
altfel
dac s<n atunci
pentru i1, p execut
{ st(k+1) i;
parti[ionare4(st,k+1,s+a(i),n)
}
}
Parti|ionare special
Probleme de generare 4
Apel: st(0) 0;
parti[ionare2(st,0,0,n)
Parti|ionare special
Probleme de generare 4
Exerci|iu
Genera[i toate descompunerile n ordine
lexicografic a numrului n=5 n valori de
1,2 i 3
Parti|ionare special
Probleme de generare 5
Solu|ie
1+1+1+1+1
1+1+1+2
1+1+2+1
1+1+3
1+2+1+1
1+2+2
1+3
2+1+1+1
2+1+2
2+2+1
2+3
3+1+1
3+2
Parti|ionare fr restric|ii
NumruI soIu|iilor 1
Problema 1. (Parti|ionare fr restric|ii)
Dndu-se un numr natural n, s se
determine numrul descompunerilor ca
sum de numere naturale nu neaprat
distincte.
P(n) = ?
Parti|ionare fr restric|ii
NumruI soIu|iilor 1
Exemplu P(n) = ?
n=4
1+1+1+1
1+1+2
1+2+1
1+3
2+1+1
2+2
3+1
4
P(4)=P(3)+P(2)+P(1)+P(0)
P(n)=P(n-1)+P(n-2)+P(0), P(0)=1
Parti|ionare fr restric|ii
NumruI soIu|iilor 1
P(n)=P(n-1)+P(n-2)+P(0), P(0)=1
64 32 16 8 4 2 1 1 P
7 6 5 4 3 2 1 0 N
Observm, c
P(n)=2
n-1
Parti|ionare cresctoare
NumruI soIu|iilor 2
Problema 2. (Parti|ionare cresctoare)
Dndu-se un numr natural n, s se determine
numrul descompunerilor ca sum de numere
naturale nu neaprat distincte, cu elementele
n ordine cresctoare.
P(n) = ?
Parti|ionare cresctoare
NumruI soIu|iilor 2
Exemplu P(n) = ?
n=4
1+1+1+1
1+1+2
1+3
P(4,1)=P(3,1)+P(2,2)+1
Numrul descompunerilor lui n cu prima valoare 21
P(n,1)= P(n-1,1)+ P(n-2,2)++P(n-[n/2],[n/2]+1)
2+2
4
Var 1. Formul recursiv
Parti|ionare cresctoare
NumruI soIu|iilor 2
Numrul descompunerilor lui n cu prima valoare 21
P(n,1)= P(n-1,1)+ P(n-2,2)++P(n-[n/2],[n/2])+1
Descompunerea lui n x cu prima valoare 2 k
[ ]

<

> +
(

+ + + +
=
k n
k k n
k n
n n
n P k k n P k k n P
k n P
, 0
2 , , 1
2 , 1 )
2
,
2
( ... ) 1 , 1 ( ) , (
) , (
0 1 2 5 4
0 1 1 3 3
0 0 1 2 2
0 0 0 1 1
4 3 2 1
Descompunerea lui n cu prima valoare 2 k
[ ]

<

> +
(

+ + + +
=
k n
k k n
k n
n n
n P k k n P k k n P
k n P
, 0
2 , , 1
2 , 1 )
2
,
2
( ... ) 1 , 1 ( ) , (
) , (
P(2,1)=P(1,1)+1
P(3,1)=P(2,1)+1
P(3,2)=1
P(4,1)=P(3,1)+P(2,2)+1
Parti|ionare cresctoare
NumruI soIu|iilor 2
Calculul recursiv:
Functie P1(n,k:natural)
{ dac n>=2*k atunci
{ S1;
pentru i k, [n/2] execut
S S+P(n-i,i);
returneaz S;}
altfel
dac n>=k atunci
returneaz 1;
altfel
returneaz 0;
}
Programare dinamic
functie P2(n,k:natural)
{ dac n<k atunci
returneaz 0
altfel
{ a(1,1)1;
pentru i 2, n execut
pentru j 1, i execut
{ a(i,j) 1;
pentru p j, [i/2] execut
a(i,j) a(i,j)+a(i-p,p) }
returneaz a(n,k)
}
}
Parti|ionare cresctoare
NumruI soIu|iilor 2
Exerci|iu
(Genera[i toate descompunerile cresctoare n
ordine lexicografic a numrului n=5)
Scrie[i formula recursiv pentru numrul
descompunerilor cresctoare a numrului n=5
Parti|ionare cresctoare
NumruI soIu|iilor 2
Solu|ie
1+1+1+1+1
1+1+1+2
1+1+3
1+2+2
1+4
2+3
5
P(5,1)=P(4,1)+P(3,2)+1=7
P(4,1)=P(3,1)+P(2,2)+1=5
P(3,1)=P(2,1)+1=3
P(2,1)=P(1,1)+1=2
P(1,1)=1
P(2,2)=1
P(3,2)=1
Parti|ionare cresctoare
NumruI soIu|iilor 2
Construiti tabelul dinamic pentru n=9
1 1 1 1 1 2 4 8 30 9
0 1 1 1 1 2 3 7 22 8
0 0 1 1 1 1 2 4 15 7
0 0 0 1 1 1 2 4 11 6
0 0 0 0 1 1 1 2 7 5
0 0 0 0 0 1 1 2 5 4
0 0 0 0 0 0 1 1 3 3
0 0 0 0 0 0 0 1 2 2
0 0 0 0 0 0 0 0 1 1
9 8 7 6 5 4 3 2 1
Parti|ionare cresctoare
NumruI soIu|iilor 2 Var. 2
O formul mai bun
1+1+1+1+1
1+1+1+2
1+2+2
1+1+3
2+3
1+4
5
P(n,k) parti[ionarea lui n n
numere nu mai mari dect k.
P(n,k)=P(n,k-1)+P(n-k,k) n>k>1
P(n,k)=1+P(n,n-1) 1<n>k
P(1,k)=P(n,1)=1.
Ex.
P(5,5)=P(5,4)+1=6+1=7
P(5,3)=P(5,2)+P(3,3)=3+2=5
Parti|ionare cresctoare
NumruI soIu|iilor 2
Construiti tabelul dinamic pentru n=9
P(6,2)=
P(6,1)+P(4,2)=
1+3=4
30 29 28 26 23 18 12 5 1 9
22 22 21 20 18 15 10 5 1 8
15 15 15 14 13 11 8 4 1 7
11 11 11 11 10 9 7 4 1 6
7 7 7 7 7 6 5 3 1 5
5 5 5 5 5 5 4 3 1 4
3 3 3 3 3 3 3 2 1 3
2 2 2 2 2 2 2 2 1 2
1 1 1 1 1 1 1 1 1 1
9 8 7 6 5 4 3 2 1
Parti|ionare cresctoare
NumruI soIu|iilor 2
Cu tablou bidimensional
Functie P(n,k:natural)
{pentru i 1, n execut
{a(1,i) 1;
a(i,1) 1;}
pentru i 2, n execut
pentru j 2, k execut
dac i>j atunci
a(i,j) a(i,j-1)+a(i-j,j);
altfel
a(i,j) 1+a(i,i-1);
returneaz a(n,k)
}
Cu tablou unidimensional
Functie P (n,k:natural)
{ a(0)1;
pentru i 1, n execut
a(i) 0;
pentru i 1, k execut
pentru j i, n execut
a(j) a(j)+a(j-i)
returneaz a(n)
}
Parti|ionare cresctoare
NumruI soIu|iilor 2
Numrul parti[iilor lui n=5
Pasul 1.
ini[ializarea:
Pasul 2.
numrul parti[iilor
Folosind doar cifra 1
Pasul 3.
numrul parti[iilor
Folosind doar cifra 2
0 0 0 0 0 1 a
5 4 3 2 1 0 i
1 1 1 1 1 1 a
5 4 3 2 1 0 i
3 3 2 2 1 1 a
5 4 3 2 1 0 i
Parti|ionare cresctoare
NumruI soIu|iilor 2
Numrul parti[iilor lui n=5 (continuare)
Pasul 4.
numrul parti[iilor
Folosind doar cifra 3
Pasul 5.
numrul parti[iilor
Folosind doar cifra 4
Pasul 6.
numrul parti[iilor
Folosind doar cifra 5
5 4 3 2 1 1 a
5 4 3 2 1 0 i
6 5 3 2 1 1 a
5 4 3 2 1 0 i
7 5 3 2 1 1 a
5 4 3 2 1 0 i
Parti|ionare strict cresctoare
NumruI soIu|iilor 3
Problema 3 (Parti|ionarea strict
cresctoare)
Dndu-se un numr natural n, s se
determine numrul descompunerilor ca
sum de numere naturale distincte, cu
elementele n ordine cresctoare.
P(n) = ?
Parti|ionare strict cresctoare
NumruI soIu|iilor 3
Cazuri
n=5
2+3
1+4
5
P(n,k) parti[ionarea lui n n numere
distincte nu mai mari dect k.
P(n,k)=P(n,k-1)+P(n-k,k-1) n>k>1
P(n,k)=1+P(n,n-1) 1<n>k
P(1,k)=P(n,1)=0.
Ex.
P(5,5)=3
P(5,3)=1
Parti|ionare strict cresctoare
NumruI soIu|iilor 3
Cu tablou unidimensional
Functie P(n:natural)
{ a(0)1;
pentru i 1, n execut
a(i) 0;
pentru i 1, n execut
pentru j n, i, pas -1 execut
a(j) a(j)+a(j-i)
returneaz a(n)
}
Cu tablou bidimensional
Functie P(n,k:natural)
{ pentru i 1, n execut
{ a(1,i) 0;
a(i,1) 0;}
pentru i 2, n execut
pentru j 2, k execut
dac i>j atunci
a(i,j) a(i,j-1)+a(i-j,j-1);
altfel
a(i,j) 1+a(i,i-1);
returneaz a(n,k)
}
Parti|ionare cresctoare
Formule recursive
4. Partitionrile lui n, n k numere nu mai
mari dect m.
P(n,m,k)=P(n,m-1,k)+P(n-m,m,k-1) , n>m>1, k>1
P(n,m,1)=P(n,m-1,1)+1 , 1<n>m
P(1,m,k)=1,
P(n,1,k)=0, , n>1,
P(n,m,1)=1 , n>m
P(n,m,1)=0 , n>m
n=8, m=4, k=5
1 1 1 1 4
1 1 1 2 3
1 1 2 2 2
Parti|ionare strict cresctoare
Formule recursive
5. Partitionrile lui n, n k numere distincte
nu mai mari dect m.
P(n,m,k)=P(n,m-1,k)+P(n-m,m-1,k-1) ,n>m>1, k>1
P(n,m,1)=P(n,m-1,1)+1 , 1<n>m
P(1,m,k)=1,
P(n,1,k)=0, , n>1,
P(n,m,1)=1 , n>m
P(n,m,1)=0 , n>m
n=10 m=5 k=3
1 4 5
2 3 5
Parti|ionare fr restric|ii
Ordonan|are1
Problema
Se consider irul parti|ionrilor fr
restric|ii al numrului n, n ordine
lexicografic. S se tipreasc
parti|ionarea cu numrul de ordine k.
Parti|ionare fr restric|ii
Ordonan|are1
Exemplu
n=4 k=5
1. 1+1+1+1
2. 1+1+2
3. 1+2+1
4. 1+3
5. 2+1+1
6. 2+2
7. 3+1
8. 4
Parti[ionarea a 5-a este
2 1 1
Cum procedm?
Stim c numrul
parti[ionrilor= 2
n-1
=8
Observm c:
4 solu[ii ncep cu 1
2 solu[ii ncep cu 2
1 solu[ie ncepe cu 3
1 solu[ie ncepe cu 4
Parti|ionare fr restric|ii
Ordonan|are1
Exemplu
n=4 k=5
1. 1+1+1+1
2. 1+1+2
3. 1+2+1
4. 1+3
5. 2+1+1
6. 2+2
7. 3+1
8. 4
P=2
n-1
=8 n=4 k=5
tp/2, nrp/2 (nr=4)
c 1;
k>nr 5>4 ? Fals
nu ncepe cu 1
tt/2, nrnr+t (nr=6)
c c+1;
k>nr 5>6 ? Adevrat
scrie c (2)
n n-c; (n=2)
k k-2*t; (k=1)
c 1

Parti|ionare fr restric|ii
Ordonan|are1
Exemplu
n=4 k=5
1. 1+1+1+1
2. 1+1+2
3. 1+2+1
4. 1+3
5. 2+1+1
6. 2+2
7. 3+1
8. 4
P=2
n-1
=8 n=4 k=5
tp/2, nrp/2 (nr=4)
c 1;
k>nr 5>4 ? Fals
nu ncepe cu 1
tt/2, nrnr+t (nr=6)
c c+1;
k>nr 5>6 ? Adevrat
scrie c (2)
n n-c; (n=2)
k k-2*t; (k=1)
c 1

Subprogram ordonantare(n,k:natural);
{
t2
n-2
; prednr 0; nr t; c 1;
Repeta
daca k=2t atunci
{scrie(n, );
n 0;}
altfel
daca k=1 atunci
{ pentru i 1,n executa
scrie (1, )
n 0}
altfel
{cattimp nr<k executa
{ prednr nr;
t [t/2];
nr nr+t;
c c+1;}
scrie(c, );
n n-c;
k k-prednr;
t2
n-2
; prednr 0;
nr t; c 1;}
pana cand n=0;
}
Subprogram ordonantare
(n,k,t,prednr,nr,c,:natural);
{
daca n>0 atunci
daca k=2t atunci scrie(n,. )
altfel
daca k=1 atunci
pentru i 1,n executa
scrie (1, )
altfel
daca nr<k atunci
ordonantare
(n,k,[t/2],nr,nr+[t/2],c+1);
altfel
{ scrie(c, );
ordonantare
(n-c,k-prednr,2
n-c-2
,0,2
n-c-2
,1);
}
}
Parti|ionare strict descresctoare
Ordonan|are 2
Problema
Se consider irul parti[ionrilor strict
descresctoare al unei sume de bani S n,
n ordine lexicografic. S se tipreasc
parti[ionarea cu numrul de ordine n.
(ONI2005 Gala|i, cl. A X-a)
Parti|ionarea strict descresctoare
Ordonan|are2
Exemplu
S=7 N=2
1. 4 2 1
2. 4 3
3. 5 2
4. 6 1
5. 7
Parti[ionarea a 2-a este
4 3
Cum procedm?
Construim tabelul dinamic cu formula
c(v,S)=P(v-1,S)+P(v-1,S-v)
c(0,0)=1
C(0,s)=0 s>0
Numrul de posibilit[i este dat de C(N,N).
Parti|ionarea strict descresctoare
Ordonan|are2
c(v,S)=P(v-1,S)+P(v-1,S-v)
S>=v
C(v,S)=C(v-1,S) S<v
c(0,0)=1
C(0,s)=0 s>0
Ce observm din ultima
coloan?
A(4,7)=2 avem dou
solu[ii care l con[in pe 4
ca cel mai mare element!
5 4 3 2 2 1 1 1 7
4 4 3 2 2 1 1 1 6
3 3 3 2 2 1 1 1 5
2 2 2 2 2 1 1 1 4
0 1 1 1 2 1 1 1 3
0 0 0 0 1 1 1 1 2
0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 1 0
7 6 5 4 3 2 1 0 c
Parti|ionarea strict descresctoare
Ordonan|are2
stabilim primul numr cu
c[i,S] >= N c[4,7]=2
c[i1,S] < N c[3,7]=0
4+.
Relum cu
SS-i (7-4=3)
N N-c[i-1,S]
Pn cnd N=0.
4+3
5 4 3 2 2 1 1 1 7
4 4 3 2 2 1 1 1 6
3 3 3 2 2 1 1 1 5
2 2 2 2 2 1 1 1 4
0 1 1 1 2 1 1 1 3
0 0 0 0 1 1 1 1 2
0 0 0 0 0 0 1 1 1
0 0 0 0 0 0 0 1 0
7 6 5 4 3 2 1 0 c
Parti|ionarea strict descresctoare
Ordonan|are 2
Completarea tabelului dinamic:
pentru i0, S execut
pentru j 0, S execut
a[i,j] 0;
a[0,0] 1;
pentru i0, S execut
{pentru j 0, i-1 execut
a[i,j] a[i-1,j];
pentru j i, S execut
a[i,j] a[i-1,j]+a[i-1,j-i];
}
Reconstituirea solutiei:
repet
i1;
cttimp a[i,S]<N executa
ii+1;
scrie(i, );
N N-a[i-1,S];
S S-i;
pana cand S=0;

S-ar putea să vă placă și