use strict; use warnings; my @array = (6, 18, 12, 2, 49); addup(2, 30, 0, [sort {$b <=> $a} @array]); sub addup { my ($num, $val, $offset, $p, @set) = @_; if ($num == 1) { for ($offset..$#{$p}) { last if @$p[$_] < $val; print join ' ', @set, $val, "\n" if @$p[$_] == $val; } } else { for ($offset..($#{$p}-$num+1)) { next if @$p[$_] > $val - $num + 1; last if @$p[$_] < int ($val / $num); addup($num-1, $val-@$p[$_], $_+1, $p, @set, @$p[$_]); } } }