in reply to Better algorithm than brute-force stack for combinatorial problems?
My take
#! perl -slw use strict; use List::Util qw[ sum ]; sub Cnr{ my( $n, @r ) = shift; return [] unless $n--; for my $x ( 0 .. ($#_ - $n) ) { push @r, map{ [ $_[$x], @$_ ] } Cnr( $n, @_[ ($x + 1) .. $#_ ] ); } return @r; } sub sums{ my( $required, @values ) = @_; return grep{ sum( @$_ ) == $required ? $_ : () } map{ Cnr( $_, @values ) } 1 .. $#values; } print "@$_" for sums( 20, 1 .. 9 ); <STDIN>; __END__ P:\test>355455 3 8 9 4 7 9 5 6 9 5 7 8 1 2 8 9 1 3 7 9 1 4 6 9 1 4 7 8 1 5 6 8 2 3 6 9 2 3 7 8 2 4 5 9 2 4 6 8 2 5 6 7 3 4 5 8 3 4 6 7 1 2 3 5 9 1 2 3 6 8 1 2 4 5 8 1 2 4 6 7 1 3 4 5 7 2 3 4 5 6
|
---|