#! perl -slw use strict; use Time::HiRes qw[ time ]; use List::Util qw[ sum ]; sub partition { my $sum = sum @_; return if $sum & 1; $sum /= 2; my @s = sort{ $b <=> $a } @_; my @a; my( $t, $n ) = ( 0, -1 ); $t + $s[$n] <= $sum and $t+= $s[$n] and push @a, $n while ++$n < @s and $t <= $sum; @a = delete @s[ @a ]; @s = grep defined, @s; return unless sum( @a ) == sum( @s ); return \@a, \@s; } our $N //= 64; my( $a, $b ) = partition 1,3,5,7; print "sum( @{ $a } ) == sum( @{ $b } )" if $a; my @set = map int( rand 100 ), 1 .. $N; my $start = time; ( $a, $b ) = partition @set; printf "Took %f seconds\n", time() - $start; if( $a ) { printf "(%u) == sum( @{ $a } ) == sum( @{ $b } )\n", sum @$a; } else { print "No solution existed for the $N element set @set"; } #### C:\test>1031699 -N=1e1 sum( 7 1 ) == sum( 5 3 ) Took 0.000042 seconds No solution existed for the 1e1 elemet set 19 41 38 74 95 79 28 90 86 87 C:\test>1031699 -N=1e1 sum( 7 1 ) == sum( 5 3 ) Took 0.000093 seconds (184) == sum( 99 53 28 2 2 ) == sum( 91 48 24 11 10 ) C:\test>1031699 -N=1e2 sum( 7 1 ) == sum( 5 3 ) Took 0.000186 seconds (2418) == sum( 99 98 97 97 96 95 95 93 90 89 88 88 84 84 82 82 82 81 80 79 75 74 73 73 73 72 71 69 59 ) == sum( 67 67 66 65 64 62 61 60 58 57 57 55 55 51 51 51 49 49 47 47 45 44 42 42 41 41 40 38 38 37 36 35 34 34 34 33 33 32 31 31 29 28 28 27 27 27 26 26 24 24 23 23 21 20 20 16 16 15 14 13 13 12 12 11 10 8 7 6 5 5 2 ) C:\test>1031699 -N=1e3 sum( 7 1 ) == sum( 5 3 ) Took 0.001379 seconds (25172) == sum( 99 99 99 99 ... 71 71 71 70 70 70 33 0 0 0 ) == sum( 70 70 70 70 70 70 ... 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 ) C:\test>1031699 -N=1e3 sum( 7 1 ) == sum( 5 3 ) Took 0.000053 seconds No solution existed for the 1e3 elemet set 26 ... 93 10 10 C:\test>1031699 -N=1e4 sum( 7 1 ) == sum( 5 3 ) Took 0.013463 seconds (247975) == sum( 99 99 ... 0 0 0 0 0 0 0 0 0 ) == sum( 70 70 ... 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 ) C:\test>1031699 -N=1e4 sum( 7 1 ) == sum( 5 3 ) Took 0.000238 seconds No solution existed for the 1e4 elemet set 60 ...72 43 21 61 24 16