Documente Academic
Documente Profesional
Documente Cultură
Clasa a 11-a
Prezentarea problemei
Exemplu:
Se consider o mulime cu n numere reale.
Se cere o submulime a sa cu numr
maxim de elemente, astfel nct suma
elementelor sale s fie maxim.
Rezolvare:
Se poate observa uor c trebuie selectate
doar elemente mai mari sau egale cu
0(valoarea 0 va fi selectat pentru a avea
numr maxim de elemente). Soluia va fi
memorat pe un vector b care va avea k
procedura greedy
k0
{ k este numrul de elemente din B}
pentru i1,n execut
dac (a[i]>=0) atunci
k k+1
b[k] a[i]
smaxsmax+a[i]
sf_procedura
Observaii
Metoda Greedy nu caut s determine toate
soluiile posibile ( care ar putea fi prea
numeroase) i apoi s aleag din ele pe cea
optim, ci caut s introduc direct un
element x n soluia optim.
Ordinul de complexitate al unui astfel de
algoritm este redus considerabil prin faptul c
se ncearc obinerea soluiei printr-o singur
parcurgere a mulimii din care se construiete
soluia optim
n practic, nainte de aplicarea metodei, se
7
fac prelucrri asupra acestei mulimi care
PROBLEMA:
10
Monede
selectate
valoare numr
365
100
3
370
100
3
65
50
1
70
50
1
15
10
1
10 caz nu
2 s-a ajuns la o soluie
erv c20
n al doilea
(
soluia
corect
5
3
1 era
+1x50+5x3=365). Aceast soluie ar fi fost
2 gsit dac
, n caz
de insucc
cut o revenire modificnd una din seleciile anterioare, dar aceasta est
acking.
11
Problem
propus
S se scrie un program care determin toate
secvenele binare de lungime n, fiecare din ele
coninnd nu mai puin de k cifre de 1.
Intrare: numere naturale n, 1<n<20, i k,
k<n, se citesc de la tastatur.
Ieire: fiecare linie a fiierului text OUT.TXT
va conine cte o secven binar distinct, ce
corespunde condiiilor din enunul problemei.
Analiza problemei
Numrul secvenelor binare de lungime n
este 2n, finit.
(vezi: Informatica, manual pentru clasa X)
Prin urmare, pentru problema dat poate fi
aplicat metoda trierii(greedy).
Modelul matematic
000
...00 0;
n
000
...01 1;
n
00
...
010
2;
n
...
n
111
...
10
2
2; s0 = 0;
n
si = si-1 + 1; i=1, ..., 2n-1
n
111
...
11
2
1;
n
Separarea subproblemelor
Generarea secvenelor binare de lungime n
cu r, r>k uniti
Generarea
secvenel
or binare
de
lungime n
Determinare
a numrului
de uniti n
secvena
curent
Prelucrar
ea
soluiei
curente
Structuri de date
Algoritm
Iniializm variabilele n i k, fiierul de ieire, tabloul B.
Pasul 1. Cercetarea secvenei curente
Se calculeaz numrul de uniti (r) n secvena curent
B
Pasul 2. Prelucrarea soluiei
Dac r k, secvena curent B este nscris n fiierul de
ieire.
Pasul 3. Verificarea prezenei secvenelor necercetate
Dac r = n se nchide fiierul de ieire, apoi STOP.
Pasul 4. Generarea secvenei urmtoare
Dac B[n]=0 atunci B[n] 1
n caz contrar: i n
att timp ct B[i] = 1 repetm
B[i] 0; i i1;
pentru indicele curent i B[i] 1
Declaraii
Program Triere;
Const Nmax=20;
type secventa01 = array [ 1 .. Nmax ] of
0..1;
var b : secventa01;
r, i , n , k : integer;
f : text;
Funcii
function numara : integer;
var s , j : integer;
begin
s:=0;
for j:=1 to n do s:=s+b[j];
numara:=s;
end;
Proceduri
procedure scrie_sol;
var j: integer;
begin
for j:=1 to n do write (f, b[j]);
writeln(f);
end;
procedure urmator (var x:secventa01);
var
j:integer;
begin j:=n;
while x[j]=1 do
begin x[j]:=0; j:=j-1; end;
x[j]:=1;
end;
Program principal
begin
readln ( n, k);
assign (f, 'OUT.TXT');rewrite(f);
for i:=1 to n-k do b[i]:=0;
for i:=k+1 to n do b[i]:=1;
repeat
r:= numara;
if r >= k then scrie_sol;
if r < n then urmator(b);
until r=n;
close(f);
end.