fr(_n,_c,_A,_k):=block([n:_n, c:_c, A:copylist(_A), i, j, x, ni, ci, imin, k:_k],
if k > 0 then (j:floor(n/A[k][1]),if j>0 then (
for i:0 thru j do (ni:n-i*A[k][1],ci:c+i*A[k][2],A[k][3]:i,fr(ni,ci,A,k-1))
) else (fr(n,c,A,k-1))) else (if (n=0) then (if z=0 then (AB:copylist(A),z:c)
elseif (z>c) then (z:c,AB:copylist(A)))),[z,AB])$
f(_n,_B):=block([n:_n,A,AB,AA,c:0,L,z:0,s],AA:(sort(_B)),L:length(AA),A:[],
for i:1 thru L do (A:append(A,[flatten([AA,0])])),AB:copylist(A),s:fr(n,c,A,L),print(s))$
B:[[5,50],[3,31]];
f(11,B)$
[112,[[3,31,2],[5,50,1]]]
Celková cena 112Kč (1x po 5 ks á 50Kč, 2x po 3 ks á 31 Kč)
B:[[1,100],[2,8],[5,5]];
f(23,B);
[47,[[1,100,0],[2,8,4],[5,5,3]]]
Celková cena 47Kč
(žádný balíček: 1ks á 100Kč)
(4 balíčky po 2 ks á 8Kč)
(3 balíčky po 5 ks á 5Kč)
prochází možnosti od největších, ty které překročí limit zahazuje a nepočítá dál. Limit se snižuje.
Výpočet pro větší hodnoty je pomalý.