use strict; use warnings; find(100, [], [100, 50, 20, 10, 5, 2, 1]); sub find { my $left = $_[0]; my @set = @{$_[1]}; my ($denom, @denom) = @{$_[2]}; print join(', ', map { "($_->[1] $_->[0]'s)" } @set), "\n" if !$left; return if !$left || !$denom; find($left, [@set], [@denom]); for (1..($left / $denom)) { find(($left - $denom * $_), [@set, [$denom, $_]], [@denom]); } }