# Usage: @list = partition( $some_target, \@list ); sub partition { my ($target, $treasures) = @_; return [] if $target == 0; return () if $target < 0 || @$treasures == 0; my ($first, @rest) = @$treasures; my @solutions = partition($target-$first, \@rest); return ((map{[$first,@$_]} @solutions), partition($target, \@rest)); }