Sunteți pe pagina 1din 14

Problema

rucsacului lacom
Enunţ

Se dă un rucsac de o anumită
capacitate, greutate și un numar de n
obiecte specificandu-se masa obiectelor.
Se cere un program care să determine
variantă de introducere a obiectelor în rucsac
astfel încât să încapă cât mai multe obiecte.
Problema rucsacului
Exemplu
N = 5;
Greutatea disponibilă = 15 kg;
1 2 3 4 5

Obiect

Greutatea
obiectelor 3kg 2kg 5kg 7kg 4kg
Problema rucsacului
Metoda Greedy
 Propune o strategie de rezolvare a problemelor
de optim în care se poate obţine optimul global
prin alegeri succesive ale optimului local, ceea
ce permite rezolvarea problemei fără a mai
reveni la deciziile deja luate.
 Specificul acestei metode constă în faptul că se
construiește soluția optimă pas cu pas, la fiecare
pas fiind selectat în soluție elementul care pare
"cel mai bun" la momentul respectiv, în speranța
că această va duce către soluția optimă globală.
Problema rucsacului
Sortarea obiectelor

1 2 3 4 5

Obiect

Greutatea
obiectelor 3kg 2kg 5kg 7kg 4kg

Problema rucsacului
Metoda Greedy:
 se iniţializează mulţimea soluţiilor (B) la mulţimea vidă (B=Φ)
 se consideră la fiecare pas câte un element x ∈ A;
 la fiecare pas se ia o decizie:
 dacă elementul x face parte din soluţia optimă, elementul este adăugat la
mulțimea soluțiilor (B=B∪{x}).
 dacă elementul x considerat, împreună cu elementele ce fac parte din soluţia
optimă parţială construită nu dă o soluţie posibilă, atunci x nu este adăugat
la soluţia optimă.
adăugarea elementului x la mulțimea soluțiilor se realizează fie prin
luarea elementelor din A într-o ordine determinată care depinde
de problemă, în ordine crescătoare;
 procedeul continuă astfel, repetitiv, până când au fost determinate
toate elementele din mulţimea soluţiilor.
Problema rucsacului
Obiect1 Obiect2 Obiect3 Obiect4 Obiect5
3 kg 2 kg 5 kg 7 kg 4kg

Greutatea disponibilă
a rucsacului este:

Greutatea obiectului
Problema rucsacului este prea mare
Algoritm de rezolvare:
 Pas 1: Citirea greutății fiecarui obiect,
Citirea capacității rucsacului.
 Pas 2: Iniţializăm obiectele.
 Pas 3: Se ordonează obiectele crescător în funcție de greutatea
lor.
 Pas 4: Se inţializează volumul disponibil cu volumul obiectului.
 Pas5 : Se verifică dacă fiecare obiect încape în rucsac astfel:
 Dacă volumul obiectului e mai mic sau egal decât volumul
disponibil al rucsacului atunci acesta încape în rucsac și din
volumul disponibil al rucsacului scădem volumul obiectului.
 Pas 6: Dacă a rămas o zonă din rucsac neocupată atunci afişăm
volumul rămas neocupat, în caz contrar înseamnă că nu am
putut introduce nici un obiect în rucsac.
Problema rucsacului
Implementare
max_ob
– numărul maxim de obiecte care pot fi puse în rucsac
N
- numărul de obiecte disponibile.
v_dis
- volumul rămas disponibil din rucsac.
O
- obiectele pe care vreau să le iau.
Greutate
- greutatea fiecarui obiect.

Problema rucsacului
program rucsac;
Var g:array [1..10] of integer;
i,n,Gm,R, aux : integer;
ok:boolean;

begin
writeln('nr obiecte'); readln(n);
writeln(‘capacitate rucsac'); readln(R);
writeln(' Obiectele de luat în rucsac:' );
for i:=1 to n do
read (g[i]);

Problema rucsacului
{ sortarea vectorului }
ok:=false;
while(ok=false) do
begin
ok:=true;
for i:=1 to n-1 do
if g[i]>g[i+1] then
begin
aux:=g[i];
g[i]:=g[i+1];
g[i+1]:=aux;
ok:=false;
end;
Problema rucsacului end;
{ verifică dacă fiecare obiect încape în rucsac }
writeln;
for i:=1 to n do
write( g[i], '*');
Gm:=0 ;
i:=1;
while ( Gm +g[i]<=R ) do
begin
Gm:=Gm+g[i];
i:=i+1;
end;
writeln('sunt‘ ,i-1,‘ obiecte cu greutate‘ , Gm,‘) ;
writeln ( ‘ a ramas‘ , R-Gm,‘ loc liber‘ ) ;
Problema rucsacului
Problema rucsacului
Program P153; Exemplu.
Const nmax=1000; Se consideră mulţimea A ={a1,a2,…,ai,…,an}
Var A : array [1..nmax] of real;
N : 1..nmax; elementele căreia sînt numerereale, iar cel puţin
B : array [1..nmax] of real; unul din ele satisface condiţia a>0. Elaboraţi un
M : 0..nmax;X : real; program caredetermină o submulţime B, B∈A,
I : 1..nmax; astfel încît suma elementelor din B să
Function ExistaElemente : Boolean; fiemaximă.De exemplu, pentru A = {21,5; -3,4;
Var i: integer; 0; -12,3; 83,6} avem B = {21,5; 83,6}.
BeginExistaElemente:=false;
For i:=1 to n do
If A[i]>0 then ExistaElemente:=true;
End;
Procedure AlegeUnElement(var x:real);
Var i: integer;
BeginI:=1;
While A[i]<=0 do
i:=i+1;
X:=A[i];
A[i]:=0; Writeln;
End; M:=0;
Procedure IncudeElementul (x:real); While ExistaElemente do
Begin Begin
M:=m+1; AlegeUnElement (x);
B[m]:=x; IncludeElementul (x);
End; End;
Begin Writeln(‘Elementele multimii B:’);
Write(‘Dati n=’); For i:=1 to m do
readln(n); writeln(B[i]);
Writeln(‘Dati elementele multimii A:’); Readln;
For i:=1 to n do End.
read(a[i]);

Problema rucsacului