вот код рекурсии, мне он почему-то очень нравится =)
procedure getsum(from: integer; current: integer);
var i: integer;
begin
for i := from to 16 do
begin
if current + cube[i] = 33 then
begin
matr[i] := true;
print_new(matr);
matr[i] := false;
end;
if current + cube[i] < 33 then
begin
matr[i] := true;
getsum(i+1,current + cube[i]);
matr[i] := false;
end;
end;
end;
паскаль, потому что его, в отличии от других языков я знаю интуитивно и больше всего чуствую =)