my @hoelzer = (3, 3); my @bretter = (1, 1, 1); my @moegliche_belegungen; my @belegung; for (@hoelzer) { push @belegung, []; } sub summe { my $sum = 0; for my $elem (@_) { $sum += $elem; } return $sum; } sub plaziere_holz { my $bretter = shift; my $belegung = shift; my @bretter = @$bretter; my @belegung = @$belegung; my $holz = shift(@bretter); unless ($holz) { push @moegliche_belegungen, [ map { [ @$_ ] } @belegung ]; return; } for my $i (0..$#hoelzer) { if ($hoelzer[$i] - summe(@{$belegung[$i]}) >= $holz) { push $belegung[$i], $holz; plaziere_holz(\@bretter, \@belegung); pop $belegung[$i]; } } } plaziere_holz(\@bretter, \@belegung); @moegliche_belegungen = sort { my $bewertung_a = 0; my $leerhoelzer_a = 0; for my $i (0..$#hoelzer) { $bewertung_a += ($hoelzer[$i] - summe(@{$a->[$i]})) **2; $leerhoelzer_a++ if summe(@{$a->[$i]}) == 0; } my $bewertung_b = 0; my $leerhoelzer_b = 0; for my $i (0..$#hoelzer) { $bewertung_b += ($hoelzer[$i] - summe(@{$b->[$i]})) **2; $leerhoelzer_b++ if summe(@{$b->[$i]}) == 0; } if ($leerhoelzer_a != $leerhoelzer_b) { return $leerhoelzer_a <=> $leerhoelzer_b; } else { return $bewertung_a <=> $bewertung_b; } } @moegliche_belegungen; for my $bel (@moegliche_belegungen) { say join(" | ", map { join('; ', @$_) } @$bel); }