use strict; use warnings; use feature qw{ say }; use Algorithm::Combinatorics qw{ combinations }; use List::Util qw{ sum }; my @tests = ( { target => 100, values => [ 1, 99, 2, 40, 50, 100, 60, 90, 3, 5, 95, 100 ], }, { target => 10, values => [ 1, 3, 2, 4 ], }, { target => 100, values => [ 5, 5, 5, 5, 10, 15, 80, 99 ], }, ); foreach my \$rhTest ( @tests ) { say qq{\nFind sums from }, join( q{, }, @{ \$rhTest->{ values } } ), qq{ making \$rhTest->{ target }}; say for do { my %seen; grep { ! \$seen{ \$_ } ++ } grep { \$_ == \$rhTest->{ target } } @{ \$rhTest->{ values } }; }; for my \$sumsOf ( 2 .. scalar @{ \$rhTest->{ values } } ) { my \$combIter = combinations( \$rhTest->{ values }, \$sumsOf ); my %seen; while ( my \$raComb = \$combIter->next() ) { next if \$seen{ join q{+}, sort { \$a <=> \$b } @{ \$raComb } } ++; say join q{+}, @{ \$raComb } if \$rhTest->{ target } == sum @{ \$raComb }; } } } ##```## Find sums from 1, 99, 2, 40, 50, 100, 60, 90, 3, 5, 95, 100 making 100 100 1+99 40+60 5+95 2+3+95 2+90+3+5 2+40+50+3+5 Find sums from 1, 3, 2, 4 making 10 1+3+2+4 Find sums from 5, 5, 5, 5, 10, 15, 80, 99 making 100 5+15+80 5+5+10+80 5+5+5+5+80 ```