Wydawanie reszty dynamicznie

0

Siemka. Mam takie zadanie, by za pomocą programowania dynamicznego wydać resztę.
Takie bardzo dynamiczne też to nie ma być, gdyż operować ma na tablicy zwykłej, o określonych rozmiarach, np. 101 elementów - czyli od 0 do 100 groszy. Ma również zwrócić ilość monet o konkretnych nominałach.
Mam tablicę nominałów - o nazwie nominały. 6 elementów typu byte. Są to {1,2,5,10,20,50}.
Czyli z tego co sądzę - ma po kolei od 0 do kwoty sprawdzać iloma to monetami można wydać, ale jakoś ma sprawdzać ile tych monet potrzeba. Jak?/

for i:=0 to kwota do
begin
  if kwoty[i] <> nies then
  begin
    if (kwoty[i]+ 1) < kwoty[i+1] then
      kwoty[i+1]:=kwoty[i]+1;
  end;
end;

nies - to wartość stała - nieskończoność - są tą wartością wypełnione wszystkie elementy oprócz pierwszego tablicy kwoty
tablica kwoty - zawiera iloma monetami można tą kwotę wydać.

0

No to tak. Udało mi się napisać odpowiednią procedurę według algorytmu opisanego tutaj: http://pl.wikipedia.org/wiki/Problem_wydawania_reszty#Algorytm_z_wykorzystaniem_programowania_dynamicznego
I tak jak być powinno - program liczy dobrze ilość monet potrzebnych do wydania reszty. Ale jak mam zrobić by wyświetlić ilość monet konkretnych nominałów, czyli np. dla kwoty 25 gr, ma być 1gr - 0szt. 2gr-0szt., 5gr - 1szt. 20gr - 1szt.
Zrobiłem tablicę dwuwymiarową - od 0 do kwoty oraz od 1 do 6 - ilość nominałów. Tam chcę zapisać ilość konkretnych nominałów.

0

Robisz tablicę struktur { size_t count,moneta; } jak wpisujesz do count ilość to do moneta wpisujesz którą monetę dodałeś.
więc u ciebie będzie:
Tb[25]={2,20}
Tb[5]={1,5} -> 5 = 25 - 20
Tb[0]={0,0} -> 0 = 5 - 5

0

No ja jednak problem z tym mam.
Ja to miałem zamiar zrobić na tej dwuwymiarowej tablicy, ale wyniki wychodzą nieprawidłowe, bo nie wiem jak wczytać poprzedni wynik, na którym "bazuję".

0

Rozumiem, Twoje rozwiązanie jest pewnie lepsze, ale...
Dla mnie ten przyklad jest troche niezrozumialy - nie wiem jak sie do tego zabrac.

0

Thiago - masz do wydania 26 "czegoś". Lecisz sobie w pętli - stoisz na nominale np. 50. Sprawdzasz ile razy możesz podzielić 26 div 50 - 0, więc wpisujesz przy nominale 50 wartość 0. Idziesz do kolejnego nominału - 20. Dzielisz 26 mod 20 - wychodzi 1 - wpisujesz przy 20 wartość 1, a od kwoty reszty odejmujesz 20*(26 div 20) - zostaje ci 6 "do wydania. Idziesz do kolejnego nominału - 10. Dzielisz 6 div 10 zostaje ci 0. Przy nominale 10 wpisujesz 0. Idziesz do nominału 5. Dzielisz 6 div 5 - otrzymujesz 1. Od kwoty reszty (6) odejmujesz 5*(6 div 5) - zostaje ci 1. Idziesz do nominału 2. 1 div 2 = 0. przy nominale 2 wpisujesz 0. Idziesz do nominału 1. 1 div 1 = 1. Przy nominale 1 wpisujesz 1, a od kwoty reszty odejmujesz 1*(1 div 1). Zostaje ci 0 do wydania.

oczywiście - po drodze warto dorobić zabezpiczenie przed nadmiermym sprawdzaniem, jeżeli wyższymi nominałami uda ci sie wcześniej wydać (np mając do wydania 50 - resztę wydasz już w pierwszym kroku).

Tym mechanizmem załatwisz też ilość dostępnych sztuk elementów danego nominału (banknotów, bilonu czy orzeszków ziemnych) - wystarczy, że będziesz miał zmienną informującą o ilości dostępnych elementów danego typu, a przy odejmowaniu odejmiesz nie więcej niż to co jest dostępne.

1 użytkowników online, w tym zalogowanych: 0, gości: 1