#!/usr/bin/perl # https://perlmonks.org/?node_id=1228495 use strict; use warnings; my @results = Solve(869, [15, 43, 51, 56, 60, 67, 122, 152, 193, 204, 229, 271, 293, 301] ); print "@$_\n" for @results; sub Solve { my $want = shift() or return []; $want > 0 or return (); my ($first, @rest) = @{ shift() } or return (); map([$first, @$_], Solve($want - $first, \@rest)), Solve($want, \@rest); }