Oto program, który to liczy:
{w tablicach w oraz c mamy dane przedmiotów}
for a := 0 to K do
wynik[0, a] := 0;
for p := 1 to N do
for a := 0 to K do begin
wynik[p, a] := wynik[p-1, a];
if (a>=1) and (wynik[p, a-1]>wynik[p, a]) then
wynik[p, a] := wynik[p, a-1];
if (a>=w[p]) and (wynik[p-1, a-w[p]]+c[p]>wynik[p, a]) then
wynik[p, a] := wynik[p-1, a-w[p]]+c[p];
end;
{w wynik[N, K] mamy rozwiązanie}
for i := 1 to dlug_x do tab[i, 0] := 0;
for j := 0 to dlug_y do tab[0, j] := 0;
for i := 1 to dlug_x do
for j := 1 to dlug_y do
if x[i]=y[j] then
tab[i, j] := tab[i-1, j-1]+1
else if tab[i-1, j]>=c[i, j-1] then
tab[i, j] := tab[i-1, j]
else
tab[i, j] := tab[i, j-1];
for i := 1 to dlug_x do tab[i, 0] := 0;
for j := 0 to dlug_y do tab[0, j] := 0;
for i := 1 to dlug_x do
for j := 1 to dlug_y do
if x[i]=y[j] then begin
tab[i, j] := tab[i-1, j-1]+1;
tab2[i, j] := OBIE;
end else if tab[i-1, j]>=c[i, j-1] then begin
tab[i, j] := tab[i-1, j];
tab2[i, j] := PIERWSZY;
end else begin
tab[i, j] := tab[i, j-1];
tab2[i, j] := DRUGI;
end;
i := dlug_x; j := dlug_y;
while (i<>0) and (j<>0) do begin
if tab2[i, j]=OBIE then begin
ciag[tab[i, j]] := x[i];
i := i-1; j:= j-1;
end else
if tab2[i, j]=PIERWSZY then
i := i-1;
else
j := j-1;
end
Na ile sposobów można wydać X złotych reszty dysponując nieograniczoną ilością monet(banknotów) o K różnych nominałach N1..NK złotych ?
{ zakladamy, ze wynik miesci sie w longint }
Program Reszty;
Const
Max_X = 10000;
Max_K = 50;
Var
X, K : longint;
Nom : array[1..Max_K] of longint; { nominaly }
s : array[0..Max_X] of longint; { liczba sposobow }
i, n : longint; { zmienne pomocnicze }
begin
readln(X); { wczytaj wielkosc reszty }
readln(K); { wczytac liczbe nominalow }
for i := 1 to K do read(Nom[i]); { wczytaj wartosci nominalow }
for i := 1 to X do s[i] := 0; { wyzeruj tablice wynikow }
s[0] := 1; { 0 zlotych mozna wydac na 1 sposob }
for n := 1 to K do begin
for i := Nom[n] to X do
s[i] := s[i] + s[i - Nom[n]];
end;
writeln(s[X]); { wypisz wynik }
end.