#!/usr/bin/env perl -l use strict; use warnings; use List::Util qw{sum}; my @test_arrays = ( [1, 3, 8, 4], [1, 6, 2], [1, 3, 5, 7], [4, 3, 2, 2, 1], [4, 3, 2, 2, 2, 2, 1], [5, 5, 4, 6, 2, 8, 1, 9], ); check_arrays($_) for @test_arrays; sub check_arrays { my @full_array = @{shift()}; print "Checking: (", join(", " => @full_array), ")"; my $sum = sum @full_array; if ($sum % 2) { print "\tSubsets not equal"; return; } my $half = $sum / 2; my (@a1, @a2); for (sort { $b <=> $a } @full_array) { push @{(sum(@a1) || 0) + $_ <= $half ? \@a1 : \@a2} => $_; } print "\tSubsets: (", join(", " => sort { $a <=> $b } @a1), ") and (", join(", " => sort { $a <=> $b } @a2), ")"; print "\tSubset sum = $half"; }