use strict; my @height = qw/ 10 15 25 30 10 13 /; my $columns = 3; my @Best = (); my $Min_height = 1E9; &check_columns ( [ 0 .. $#height ] ); print "best result: \n"; # print join(" ", map { join('#', @$_) } @Best), "\n"; foreach my $y (0..$Table_height) { foreach my $x (0..$columns) { my $data = ${$Best[$x]}[$y]; print defined $data ? $data : " "; print " "; } print "\n"; } # check column height combinations sub check_columns { my $pcat = shift; foreach my $p (0 .. $#{@$pcat} - 1) { my @result = ( [ @$pcat[0 .. $p] ], [ @$pcat[$p + 1 .. $#{@$pcat}] ], @_); if ($#result == $columns) { # @result is an array of arrays # print join(" ", map { join('#', @$_) } @result), "\n"; my $max_height = 0; foreach my $j (@result) { my $height = 0; # foreach my $i (@$j) { print "$i:$height[$i] "; }; print "\n"; foreach my $i (@$j) { $height += $height[$i] }; $max_height = $height if $height > $max_height; } # print "max_height: $max_height\n"; if ($max_height < $Min_height) { $Min_height = $max_height; @Best = @result; } } else { check_columns(@result); } } }