Čtvrťáků použiju jen minimální množství, aby se zbytkem dal zaplatit zbytek. Stejně tak desetníků, pak nikláků a co zbude, doplatím v centech.
Kvůli nedělitelnosti čísel 25 a 10 existuje jedna výjimka: někdy je třeba použít o 1 čtvrťák více!
Procedure TrySol (Pr: Integer; Idx: Integer; Plus: Boolean); Var I, C: Integer; Prev: Integer; Begin Prev := (Pr - Sum[Idx] + Nom[Idx+1]-1) div Nom[Idx+1]; If (Pr < Sum[Idx]) then Prev := 0; If (Plus) then Inc (Prev); Use[Idx+1] := Prev; Pr := Pr - Prev * Nom[Idx+1]; if (Prev > Cnt[Idx+1]) then { too many coins needed in the previous step } else If (Idx > 0) then TrySol (Pr, Idx-1, false) else if (Pr = 0) then Begin C := 0; For I := 1 to 4 do C := C + Use[I]; If (C = ResCnt) then WriteLn ('WARNING! Two possible solutions!'); If (C > ResCnt) then Begin ResCnt := C; For I := 1 to 4 do ResUse[I] := Use[I]; End; End; End; { TrySol }
ReadLn (Cnt[1], Cnt[2], Cnt[3], Cnt[4]); Sum[0] := 0; For I := 1 to 4 do Begin Val[I] := Cnt[I] * Nom[I]; Sum[I] := Sum[I-1] + Val[I]; End; ResCnt := 0; TrySol (Price, 3, false); TrySol (Price, 3, true);