PROGRAM Hlad;
 CONST maxn=50;
       nplatidel=12;
       platidla: ARRAY[1..nplatidel] OF INTEGER=
                 (1,2,5,10,20,50,100,200,500,1000,2000,5000);
       mnuget=3;
       nugety: ARRAY[1..mnuget] OF INTEGER=(6,9,20);
 TYPE vektor=ARRAY[1..maxn] OF INTEGER;
 VAR aa,cc: vektor;
     nn,i,mm:INTEGER;

{Nerekurzivni algoritmus: n=rozkladane cislo, k=delka vektoru,
                          c=vysledek, a=podle ceho rozkladam;
 V pripade nenalezeni rozkladu c=(0,0,0,...,0)}
 PROCEDURE Hld1(n,k:INTEGER; VAR c,a:vektor);
  VAR i,Delta:INTEGER;
 BEGIN
  FOR i:=1 TO k DO c[i]:=0;
  Delta:=n;
  c[k+1]:=1; a[k+1]:=-n-1;               {Zarazka}
  i:=k;
  WHILE (Delta>0) DO
    IF i<>0 THEN BEGIN
             c[i]:=Delta DIV a[i];
             Delta:=Delta-c[i]*a[i];
             i:=PRED(i)
            END
    ELSE BEGIN
      REPEAT i:=SUCC(i) UNTIL (c[i]<>0);
      c[i]:=PRED(c[i]);
      Delta:=Delta+a[i];
      i:=PRED(i)
    END
 END;

{Rekurzivni algoritmus: vyznam parametru viz Hld1}
 PROCEDURE Hld2(n,k:INTEGER; VAR c:vektor; a:vektor);
  VAR Delta: INTEGER;
  FUNCTION Nenalezen(D,i:INTEGER):BOOLEAN;
  VAR Nenal: Boolean;
  BEGIN
    Nenal:=TRUE;
    IF (i>0)THEN BEGIN
      c[i]:=D DIV a[i];
      IF (D=c[i]*a[i])
        THEN Nenal:=FALSE
        ELSE
         WHILE ((c[i]>=0) AND (Nenal)) DO BEGIN
           Nenal:=Nenalezen(D-c[i]*a[i],i-1);
           IF Nenal THEN c[i]:=PRED(c[i]);
         END;
    END;
    IF c[i]<0 THEN c[i]:=0;
    Nenalezen:=Nenal;
  END;
 BEGIN
  IF Nenalezen(n,k) THEN WRITELN('Rozklad nenalezen')
 END;

{Vypis koeficientu}
 PROCEDURE Vypis(n,k:INTEGER; c,a:vektor);
  VAR i: INTEGER;
 BEGIN
  WRITELN('Vycet koeficientu rozkladu cisla ',n);
  WRITELN('     hodnota  koeficient');
  FOR i:=1 TO k DO
   IF (c[i]>0) THEN WRITELN(a[i]:10,c[i]:10);
 END;

BEGIN
  WRITELN('=========ROZKLAD SUMY DO PLATIDEL (CELE KC)=========');
  FOR i:=1 TO nplatidel DO aa[i]:=platidla[i];
  WRITE('Zadej sumu: '); READLN(nn);
{Mozno pouzit take: Hld2(nn,nplatidel,cc,aa);}
  Hld1(nn,nplatidel,cc,aa);
  vypis(nn,nplatidel,cc,aa);
  WRITELN('=========ZJISTI ROZKLAD McNugget-oveho CISLA=========');
  FOR i:=1 TO mnuget DO aa[i]:=nugety[i];
  WRITE('Zadej cislo: '); READLN(nn);
{Mozno pouzit take: Hld1(nn,mnuget,cc,aa);}
  Hld2(nn,mnuget,cc,aa);
  mm:=0;
  FOR i:=1 TO mnuget DO mm:=mm+cc[i];
  IF mm=0 THEN
    WRITELN(nn,' neni McNugget-ove cislo.')
  ELSE vypis(nn,mnuget,cc,aa);
  READLN;
END.