prof. zoltan szabo - educampion.edu.ro/arhiva/www/arhiva_2009/papers/paper22.pdf · combinatoric...
TRANSCRIPT
-
Combinatoric�
prof. Zoltan Szabo
Parti�ionarea unui num�r
Pregatirea lotului national de informatica – juniori
Iasi, 2008
-
Parti�ionarea unui num�r
• Tipuri de probleme–Probleme de generare –Num�rul parti�ion�rilor–Num�rul de ordine al unei configura�ii în
mul�imea ordonat� a solu�iilor
-
Parti�ionare f�r� restric�ii Probleme de generare 1
• Problema 1. (Parti�ionare f�r� restric�ii)
��������-se un num�r natural n, s� se descompun� în toate modurile posibile ca sum� de numere naturale nenule nu neap�rat distincte.
-
Parti�ionare f�r� restric�ii Probleme de generare 1
• Exemplun=4
1+1+1+11+1+21+2+11+3
2+1+12+23+14
-
Subprogram parti�ionare1(st:stiv�,k,s,n:natural){ dac� n=s atunci
tip�rete (st,k)altfel
pentru i1, n-s execut�{ st(k+1) i;
parti�ionare1(st,k+1,s+i,n)}
}
Parti�ionare f�r� restric�ii Probleme de generare 1
Apel: parti�ionare1(st,0,0,n)
-
Parti�ionare f�r� restric�ii Probleme de generare 1
• Exerci�iu
Genera�i toate descompunerile f�r� restric�ii în ordine lexicografic� a num�rului n=5
-
Parti�ionare f�r� restric�ii Probleme de generare 1
Solu�ie1+1+1+1+11+1+1+21+1+2+11+1+31+2+1+11+2+21+3+11+4
2+1+1+12+1+22+2+12+33+1+13+24+15
-
Parti�ionare cresc�toareProbleme de generare 2
• Problema 2. (Parti�ionare cresc�toare)
��������-se un num�r natural n, s� se descompun� în toate modurile posibile ca sum� de numere naturale nenule nu neap�rat distincte aranjate cresc�tor.
-
Parti�ionare cresc�toareProbleme de generare 2
• Exemplun=4
1+1+1+11+1+21+32+24
-
Subprogram parti�ionare2(st:stiv�,k,s,n:natural){ dac� n=s atunci
tip�rete (st,k)altfel
pentru ist(k),��-s execut�{ st(k+1) i;
parti�ionare2(st,k+1,s+i,n)}
}
Parti�ionare cresc�toareProbleme de generare 2
Apel: st(0) �1;parti�ionare2(st,0,0,n)
-
Parti�ionare cresc�toareProbleme de generare 2
• Exerci�iu
Genera�i toate descompunerile cresc�toare în ordine lexicografic� a num�rului n=5
-
Parti�ionare cresc�toareProbleme de generare 2
Solu�ie1+1+1+1+11+1+1+21+1+31+2+21+4 2+3 5
-
Parti�ionare strict cresc�toareProbleme de generare 3
• Problema 3. (Parti�ionare strict cresc�toare)
��������-se un num�r natural n, s� se descompun� în toate modurile posibile ca sum� de numere naturale distincte aranjate cresc�tor.
-
Parti�ionare strict cresc�toareProbleme de generare 3
• Exemplun=4
1+34
-
Subprogram parti�ionare3(st:stiv�,k,s,n:natural){ dac� n=s atunci
tip�rete (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 cresc�toareProbleme de generare 3
Apel: st(0) 0;parti�ionare2(st,0,0,n)
-
Parti�ionare strict cresc�toareProbleme de generare 3
• Exerci�iu
Genera�i toate descompunerile strict cresc�toare în ordine lexicografic� a num�rului n=5
-
Parti�ionare strict cresc�toareProbleme 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)
��������-se un num�r natural n, s� se descompun� în toate modurile posibile ca sum� de p numere naturale: a1, a2,…, ap, .
-
Parti�ionare special�Probleme de generare 4
• Exemplun=5p=2 a=(1,2)
1+1+1+1+11+1+1+21+1+2+11+2+1+11+2+22+1+1+12+1+22+2+1
-
Subprogram parti�ionare4(st:stiv�,k,s,n:natural){ dac� s=n atunci
tip�rete (st,k)altfel
dac� s
-
Parti�ionare special�Probleme de generare 4
• Exerci�iu
Genera�i toate descompunerile în ordine lexicografic� a num�rului n=5 în valori de
1,2 i 3
-
Parti�ionare special�Probleme de generare 5
Solu�ie1+1+1+1+11+1+1+21+1+2+11+1+31+2+1+11+2+21+32+1+1+12+1+22+2+12+3 3+1+13+2
-
Parti�ionare f�r� restric�ii �����������iilor 1
• Problema 1. (Parti�ionare f�r� restric�ii)
��������-se un num�r natural n, s� se determine num�rul descompunerilor ca sum� de numere naturale nu neap�rat distincte.
P(n) = ?
-
Parti�ionare f�r� restric�ii �����������iilor 1
• Exemplu P(n) = ? n=4
1+1+1+11+1+21+2+11+3
2+1+12+23+14
• 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 f�r� restric�ii �����������iilor 1
• P(n)=P(n-1)+P(n-2)+…P(0), P(0)=1
64321684211P76543210N
• Observ�m, c�
P(n)=2n-1
-
Parti�ionare cresc�toare �����������iilor 2
• Problema 2. (Parti�ionare cresc�toare)
��������-se un num�r natural n, s� se determine num�rul descompunerilor ca sum� de numere naturale nu neap�rat distincte, cu elementele în ordine cresc�toare.
P(n) = ?
-
Parti�ionare cresc�toare �����������iilor 2
Exemplu P(n) = ? n=4
1+1+1+11+1+21+3
• P(4,1)=P(3,1)+P(2,2)+1
Num�rul descompunerilor lui n cu prima valoare 1P(n,1)= P(n-1,1)+ P(n-2,2)+…+P(n-[n/2],[n/2]+1)
2+24
Var 1. Formul� recursiv�
-
Parti�ionare cresc�toare �����������iilor 2
Num�rul descompunerilor lui n cu prima valoare 1P(n,1)= P(n-1,1)+ P(n-2,2)+…+P(n-[n/2],[n/2])+1
Descompunerea lui n x cu prima valoare k
[ ]��
�
��
�
�
<∈
>+���
�
��
��
−+++−−+−
=kn
kkn
knnn
nPkknPkknP
knP
,02,,1
2,1)2
,2
(...)1,1(),(
),(
-
01254
01133
00122
00011
4321
Descompunerea lui n cu prima valoare k
[ ]��
�
��
�
�
<∈
>+���
�
��
��
−+++−−+−
=kn
kkn
knnn
nPkknPkknP
knP
,02,,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 cresc�toare �����������iilor 2
Calculul recursiv:
Functie P1(n,k:natural){�������>=2*k atunci
{ S1;pentru i k, [n/2]�������
S S+P(n-i,i);returneaz� S;}
����������
�������������>=k atuncireturneaz���;
��������������
�����������������������0;}
Programare dinamic�
functie P2(n,k:natural){��������
-
Parti�ionare cresc�toare �����������iilor 2
• Exerci�iu
(Genera�i toate descompunerile cresc�toare în ordine lexicografic� a num�rului n=5)
Scrie�i formula recursiv� pentru num�rul descompunerilor cresc�toare a num�rului n=5
-
Parti�ionare cresc�toare �����������iilor 2
Solu�ie1+1+1+1+11+1+1+21+1+31+2+21+4 2+3 5
P(5,1)=P(4,1)+P(3,2)+1=7P(4,1)=P(3,1)+P(2,2)+1=5
P(3,1)=P(2,1)+1=3P(2,1)=P(1,1)+1=2
P(1,1)=1P(2,2)=1
P(3,2)=1
-
Parti�ionare cresc�toare �����������iilor 2
Construiti tabelul dinamic pentru n=9
1111124830901111237228
00111124157
00011124116
0000111275
0000011254
0000001133
0000000122
0000000011
987654321
-
Parti�ionare cresc�toare �����������iilor 2 – Var. 2
O���������“mai bun�”
1+1+1+1+11+1+1+2
1+2+21+1+3
2+31+4
5
P(n,k) – parti�ionarea lui n în numere nu mai mari decât k.
P(n,k)=P(n,k-1)+P(n-k,k) n>k>1P(n,k)=1+P(n,n-1) 1
-
Parti�ionare cresc�toare �����������iilor 2
Construiti tabelul dinamic pentru n=9
P(6,2)=P(6,1)+P(4,2)=1+3=4
3029282623181251922222120181510518
1515151413118417
111111111097416
7777765315
5555554314
3333333213
2222222212
1111111111
987654321
-
Parti�ionare cresc�toare �����������iilor 2
Cu tablou bidimensionalFunctie 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�
�����������>j atuncia(i,j) a(i,j-1)+a(i-j,j);
altfela(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 cresc�toare �����������iilor 2
Num�rul parti�iilor lui n=5Pasul 1. ini�ializarea:
Pasul 2. num�rul parti�iilorFolosind doar cifra 1
Pasul 3. num�rul parti�iilorFolosind doar cifra 2
000001a543210i
111111a543210i
332211a543210i
-
Parti�ionare cresc�toare �����������iilor 2
Num�rul parti�iilor lui n=5 (continuare)Pasul 4. num�rul parti�iilorFolosind doar cifra 3
Pasul 5. num�rul parti�iilorFolosind doar cifra 4
Pasul 6. num�rul parti�iilorFolosind doar cifra 5
543211a543210i
653211a543210i
753211a543210i
-
Parti�ionare strict cresc�toare �����������iilor 3
• Problema 3 (Parti�ionarea strict cresc�toare)
Dându-se un num�r natural n, s� se determine num�rul descompunerilor ca sum� de numere naturale distincte, cu elementele în ordine cresc�toare.
P(n) = ?
-
Parti�ionare strict cresc�toare �����������iilor 3
Cazurin=5
2+31+4
5
P(n,k) – parti�ionarea lui n în numere distincte nu mai mari decât k.
P(n,k)=P(n,k-1)+P(n-k,k-1) n>k>1P(n,k)=1+P(n,n-1) 1
-
Parti�ionare strict cresc�toare �����������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)
����������������(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�
�����������>j atuncia(i,j) a(i,j-1)+a(i-j,j-1);
altfela(i,j) 1+a(i,i-1);
returneaz� a(n,k)}
-
Parti�ionare cresc�toare Formule recursive
4. Partition�rile lui n, în k numere nu mai mari decât m.
P(n,m,k)=P(n,m-1,k)+P(n-m,m,k-1) , n>m>1, k>1P(n,m,1)=P(n,m-1,1)+1 , 11,P(n,m,1)=1 , n�mP(n,m,1)=0 , n>m
n=8, m=4, k=51 1 1 1 41 1 1 2 31 1 2 2 2
-
Parti�ionare strict cresc�toare Formule recursive
5. Partition�rile lui n, în k numere distinctenu mai mari decât m.
P(n,m,k)=P(n,m-1,k)+P(n-m,m-1,k-1) ,n>m>1, k>1P(n,m,1)=P(n,m-1,1)+1 , 11,P(n,m,1)=1 , n�mP(n,m,1)=0 , n>m
n=10 m=5 k=3
1 4 5
2 3 5
-
Parti�ionare f�r� restric�iiOrdonan�are1
ProblemaSe consider� �irul parti�ion�rilor f�r� restric�ii al num�rului n, în ordine lexicografic�. S� se tip�reasc� parti�ionarea cu num�rul de ordine k.
-
Parti�ionare f�r� restric�ii Ordonan�are1
• Exemplun=4 k=5
1. 1+1+1+12. 1+1+23. 1+2+14. 1+35. 2+1+16. 2+27. 3+18. 4
Parti�ionarea a 5-a este�������������
Cum proced�m?
�tim c� num�rul parti�ion�rilor= 2n-1=8
Observ�m c�: 4 solu�ii încep cu 12 solu�ii încep cu 21 solu�ie începe cu 31 solu�ie începe cu 4
-
Parti�ionare f�r� restric�ii Ordonan�are1
• Exemplun=4 k=5
1. 1+1+1+12. 1+1+23. 1+2+14. 1+35. 2+1+16. 2+27. 3+18. 4
P=2n-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 ?����������� scrie c (2)
n n-c; (n=2)k k-2*t; (k=1)c 1
…
-
Parti�ionare f�r� restric�ii Ordonan�are1
• Exemplun=4 k=5
1. 1+1+1+12. 1+1+23. 1+2+14. 1+35. 2+1+16. 2+27. 3+18. 4
P=2n-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 ?����������� scrie c (2)
n n-c; (n=2)k k-2*t; (k=1)c 1
…
-
Subprogram ordonantare(n,k:natural);{ t2n-2; prednr 0; nr t; c 1;Repeta
daca k=2t atunci {scrie(n,’ ’);n 0;}
altfeldaca k=1 atunci
{ pentru i 1,n executascrie (1,’ ’)
n 0}altfel
{cattimp nr0 atunci
daca k=2t atunci scrie(n,.’ ‘)altfel
daca k=1 atuncipentru i 1,n executa
scrie (1,’ ’)altfel
daca nr
-
Parti�ionare strict descresc�toareOrdonan�are 2
ProblemaSe consider� irul parti�ion�rilor�������descresc�toare al unei sume de bani S n,în ordine lexicografic�. S� se tip�reasc� parti�ionarea cu num�rul de ordine n.
(ONI2005 Gala�i, cl. A X-a)
-
Parti�ionarea strict descresc�toare Ordonan�are2
• ExempluS=7 N=21. 4 2 12. 4 33. 5 24. 6 15. 7
Parti�ionarea a 2-a este�����������
Cum proced�m?Construim tabelul dinamic cu formulac(v,S)=P(v-1,S)+P(v-1,S-v)c(0,0)=1C(0,s)=0 s>0
Num�rul ������ �!������i este dat de C(N,N).
-
Parti�ionarea strict descresc�toare Ordonan�are2
c(v,S)=P(v-1,S)+P(v-1,S-v)S>=v
C(v,S)=C(v-1,S) S0• Ce observ�m din ultima
coloan�?• A(4,7)=2 avem dou�
solu�ii care îl con�in pe 4 ca cel mai mare element!
54322111744322111633322111522222111401112111300001111200000011100000001076543210c
-
Parti�ionarea strict descresc�toare Ordonan�are2
stabilim��������������cu
c[i,S] >= N c[4,7]=2c[i–1,S] < N c[3,7]=0
4+…….Relu�m cuSS-i (7-4=3)
N N-c[i-1,S]Pân� când N=0.
4+3 54322111744322111633322111522222111401112111300001111200000011100000001076543210c
-
Parti�ionarea strict descresc�toare 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�������
a[i,j] a[i-1,j];pentru j i, S�������
a[i,j] a[i-1,j]+a[i-1,j-i];}
Reconstituirea solutiei:
repet�i1;câttimp a[i,S]