sub find_best_partition { # We're going to try to find partitions that add up to each possible # number that can be added up to. my $old; my $new = {0 => [[], []]}; for my $n (sort {$a <=> $b} @_) { $old = $new; $new = {}; while (my ($key, $value) = each %$old) { my ($p1, $p2) = @$value; $new->{$key + $n} ||= [[$n, $p1], $p2]; $new->{$key - $n} ||= [$p1, [$n, $p2]]; } } my $best = each %$new; while (my $difference = each %$new) { if (abs($difference) < abs($best)) { $best = $difference; } } # We need to flatten our nested arrays. my ($p1, $p2) = @{ $new->{$best} }; my @part_1; while (@$p1) { push @part_1, $p1->[0]; $p1 = $p1->[1]; } my @part_2; while (@$p2) { push @part_2, $p2->[0]; $p2 = $p2->[1]; } return (\@part_1, \@part_2); }