http://www.perlmonks.org?node_id=546466


in reply to puzzle: how many ways to make $100

Perhaps not the most beautiful or efficient thing in the world, but it works:
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 !$le +ft; return if !$left || !$denom; find($left, [@set], [@denom]); for (1..($left / $denom)) { find(($left - $denom * $_), [@set, [$denom, $_]], [@denom]); } }