Primjer zadatka: Torba, IBT 2008
-------------------------------------------------------------------------------------------------------------------
Martina je potajno napustila teško natjecanje iz informatike pola sata prije završetka, kako bi mogla potamaniti što više čokolada koje se dijele natjecateljima, po mogućnosti prije nego Ivana učini to isto. Nakon što je pojela sve što je mogla, odlučila je što više tih čokolada ponijeti kući. Na prethodnom kolu natjecanja saznala je da njena torba može izdržati masu od najviše N grama.
Kako je preostalo M čokolada, a na svakoj čokoladi piše njena masa izražena u gramima,moguće je odrediti koliko maksimalno čokolade Martina može odnijeti u svojoj torbi. Napišite program koji to određuje.
Važno: Martina mora uzimati isključivo cijele čokolade, tj. ne smije ih lomiti.
-------------------------------------------------------------------------------------------------------------------
Uzmite za svaki predmet njegovu vrijednost i
podjelite ju sa velicinom da dobijete odnos vrijednost/velicina, i nakon
toga uzimite samo one predmete koji imaju najveci omjer.
Dakle sortirate te predmete po omjeru vrijednosti, krenete od onoga koji ima najveći omjer, provjerite stane li u ruksak, ako ne stane idete na idući po vrijednosti, ako on stane u ruksak, oduzimate njegovu velicinu od velicine ruksaka da dobijete slobodno preostalo mjesto u ruksaku. Pa opet iznova trazite predmet sa najvecim omjerom koji stane u preostalo mjesto ruksaka, to ponavljate dokle god ima mjesta i predmeta koji bi mogli stati.
Rješenje:Dakle sortirate te predmete po omjeru vrijednosti, krenete od onoga koji ima najveći omjer, provjerite stane li u ruksak, ako ne stane idete na idući po vrijednosti, ako on stane u ruksak, oduzimate njegovu velicinu od velicine ruksaka da dobijete slobodno preostalo mjesto u ruksaku. Pa opet iznova trazite predmet sa najvecim omjerom koji stane u preostalo mjesto ruksaka, to ponavljate dokle god ima mjesta i predmeta koji bi mogli stati.
------------------------------------------------------------------------------------------------------------------
const MAXM = 15;
var n, m, i, najvise, masa : integer;
g : array[1..MAXM] of integer;
(* p(i) = 0 ako i-tu cokoladu ne uzimamo
p(i) = 1 ako i-tu cokoladu uzimamo
p(0) ima posebnu namjenu: ako je algoritam zavrsio, bit ce p(0) = 1 *)
p : array[0..MAXM] of integer;
begin
readln(n);
readln(m);
for i:=1 to m do readln(g[i]);
for i:=0 to m do p[i] := 0;
najvise := 0;
repeat
masa := 0;
for i:=1 to m do if p[i] = 1 then masa := masa + g[i];
if (masa <= n) and (masa > najvise) then najvise := masa;
p[m] := p[m] + 1;
i := m;
while (p[i] > 1) do
begin
p[i] := 0;
i := i - 1;
p[i] := p[i] + 1;
end;
until p[0] <> 0;
writeln(najvise);
end.
---------------------------------------------------------------------------------------------------------------
Problem naprtnjače je jedan od jednostavnijih primjera dinamičkoga programiranja, tako je današnja lekcija bila uvertira za sljedeće.
Nema komentara:
Objavi komentar