Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 25. 12. 2011 21:55 — Editoval martinko18 (25. 12. 2011 21:57)

martinko18
Zelenáč
Příspěvky: 24
Reputace:   
 

Greedy (pažravý) algoritmus - Pascal

Zdravim Vas, moc sa v programovani nevyznam, len by som potreboval sfunkcnit tento priklad v pascale.

Napr. zadanie:
V obchode chceme zaplatiť  nákup v hodnote 5.69 EUR. Používame bežnú sadu euro mincí, t. j. mince v hodnotách 1, 2, 5, 10, 20, 50 centov a 1, 2 eurá. Z každej hodnoty máme dostatočne veľa mincí. Aké mince použiť  na zaplatenie vyššie spomenutej sumy, aby sme dokopy použili čo najmenej kusov?


Priklad, ktory ak viete, pomozte mi sfunkcnit - doplnit, aby fungoval:



const Mince : array [1..8] of longint =

      (200, 100, 50, 20, 10, 5, 2, 1);

procedure Platba ( SumaVCentoch : longint );

var AktualnaSuma, m : longint;

begin

  AktualnaSuma := SumaVCentoch;

  m := 1;

  while AktualnaSuma > 0 do begin

    if Mince[ m ] <= AktualnaSuma then begin

      writeln ( Mince[ m ] );

      AktualnaSuma := AktualnaSuma -

                      Mince[ m ];

    end else

      inc(m);

  end;

end;

Offline

  • (téma jako vyřešené označil(a) frank_horrigan)

#2 25. 12. 2011 23:55 — Editoval frank_horrigan (26. 12. 2011 00:05)

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Greedy (pažravý) algoritmus - Pascal

Ahoj,

pascal jsem už dávno zapomněl, ale jestli ti pomůže algoritmus v pseudokódu, tak ti zkusím dát svůj pohled, jak bych to řešil.

Takže:

vstup: načíst ze standardního vstupu, a uložit do reálné proměnné (rikejme ji ToPay)
deklarovat celociselnou promennou (rikejme ji centsToPay, a do te ulozit ToPay vynasobenou 100 (tim budeme pracovat s centovymi mincemi, nebo jejich násobky)
vydělit centsToPay hodnotou 200, a vysledek ulozit do celociselne promenne twoEurCoinsPaid
provest deleni modulo centsToPay hodnotou 200, a vysledek ulozit do centsToPay
vydelit centsToPay hodnotou 100, a vysledek ulozit do promenne oneEurCoinsPaid
provet deleni modulo centsToPay hodnotou 100, a vysledek uložit do centsToPay
vydelit centsToPay hodnotou 50, a vysledek ulozit do promenne fiftyCentCoinPaid
provest deleni modulo.........
.
.
.
vydelit centsToPay hodnotou 2, vysledek ulozit do twoCentCoinPaid
provest modulo centsToPay 2, vysledek ulozit do oneCentCoinPaid

Vypsat na standardní výstup obsah výstupních proměnných

konec.

To je základ, teď (taky jsem mohl od začátku, ale schválně jsem to rozepsal) - když si na začátku deklaruješ pole, do kterého uložíš hodnoty mincí, a druhé pole, které bude obsahovat CentCoinPaid, tak celou operaci provedeš v jednom cyklu, který bude mít dva výkonné řádky.

Ošetření chyb vstupu, zaokrouhlení správného, ale "zbytečně" dlouhého vstupu a pod. neřešíme (pokud chceš (měl bys chtít), můžeš odřešit sám.

EDIT: operace dělení modulo (v C, Javě, a dalších několika modernějších jazycích má operátor '%' - a výsledkem je zbytek po celočíselném dělení


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

#3 26. 12. 2011 16:05

Dioxid
Příspěvky: 416
Reputace:   13 
 

Re: Greedy (pažravý) algoritmus - Pascal

Zdravím, ten tvůj algoritmus jsem testoval na pár přikladech a přišel mi správný. Postup, který navrhoval ↑ frank_horrigan: jsem si dovolil zapsat do kódu. Rozdíl oproti tomu, co zde popsal, je ale takový, že výstup se neukládá do proměnné ale rovnou vypisuje. Případná změna na zápis do proměnné by ale byla jednoduchá.

Například pro vstup 146 centů se vypíše:
1 krat 100
2 krat 20
1 krat 5
1 krat 1


Code:

const Mince : array [1..8] of longint =

      (200, 100, 50, 20, 10, 5, 2, 1);

procedure Platba ( SumaVCentoch : longint );

var AktualnaSuma, m : longint;

begin

  AktualnaSuma := SumaVCentoch;

  m := 1;

  for m:=1 to 8 do begin

    if(aktualnasuma div mince[m]>0) then writeln(aktualnasuma div mince[m],' krat ',mince[m]);

    aktualnasuma:=aktualnasuma mod mince[m];

  end;

end;

Jsem omylný, proto ne vše, co jsem napsal, je zaručeně správně.
468

Offline

 

#4 28. 12. 2011 17:52

martinko18
Zelenáč
Příspěvky: 24
Reputace:   
 

Re: Greedy (pažravý) algoritmus - Pascal

Dakujem za pomoc, idem to este poskusat.

Offline

 

#5 29. 12. 2011 00:02

frank_horrigan
Příspěvky: 938
Reputace:   31 
 

Re: Greedy (pažravý) algoritmus - Pascal

Já také děkuji, označím za vyřešené


The only thing worse than being wrong is staying wrong
Sun Tzu - The Art of War

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson