Enumerator
Mitglied Kamel
50 Zeilen BruteForce: Beim Schreiben und in der Ausführung.. 
Das Skript probiert einfach alle möglichen Kombinationen aus - 2 "hoch" der-Anzahl-der-Sweeties-die-nicht-schon-allein-über-das-Maximum-hinaus-schießen ergibt die Anzahl der möglichen Kombinationen - diese werden in einer Schleife abgezählt. In jeder Iteration repräsentiert das Bitmuster der Zahl die aktuelle Kombi zum Testen, ein wenig Shiften und schon kann man mit den Werten arbeiten:
Mal schauen ob ich noch Zeit und Muße finde, mir schwirren da schon ein paar Optimierungen durch den Kopf...
Bis dahin -
Gruß
Enum

Das Skript probiert einfach alle möglichen Kombinationen aus - 2 "hoch" der-Anzahl-der-Sweeties-die-nicht-schon-allein-über-das-Maximum-hinaus-schießen ergibt die Anzahl der möglichen Kombinationen - diese werden in einer Schleife abgezählt. In jeder Iteration repräsentiert das Bitmuster der Zahl die aktuelle Kombi zum Testen, ein wenig Shiften und schon kann man mit den Werten arbeiten:
Perl:
#!/usr/bin/perl -w
use strict;
sub usage {
print STDERR <<'EOT;';
Na, da stimmt wohl was mit der Eingabe nicht! Schau mal hier:
tutorials.de/forum/diskussion/357969-quiz-15-lisas-osternest.html
EOT;
exit -1;
}
my($max, @sweeties, %best, $i, $j, $k) = ();
# Input
$max = int <STDIN> or &usage;
while(1) {
my $name = <STDIN>;
last unless $name;
chomp $name;
last if $name =~ /^\s*$/ and @sweeties;
&usage unless $name =~ s/^\s*(.+?)\s*$/$1/;
my $data = <STDIN>;
&usage unless $data =~ /^\s*([0-9]+)\s+([0-9]+)\s$/;
next if $1 > $max;
push @sweeties, { name => $name, g => $1, kcal => $2 };
}
&usage unless @sweeties;
# Process
%best = (%{ $sweeties[0] }, no => 1 );
CANDIDATE:
for($i = 2; $i != 2 ** @sweeties; ++$i) {
my($g, $kcal) = (0, 0);
for(($j, $k) = ($i, 0); 0 != $j; $j >>= 1, ++$k) {
next unless $j & 1;
next CANDIDATE if ($g + $sweeties[$k]{g}) > $max;
$g += $sweeties[$k]{g};
$kcal += $sweeties[$k]{kcal};
}
%best = ( no => $i, g => $g, kcal => $kcal )
if $kcal > $best{kcal} or ($kcal == $best{kcal} and $g < $best{g});
}
# Output
print "Optimale Auswahl: ";
for(($j, $k) = ($best{no}, 0); 0 != $j; $j >>= 1, ++$k) {
print $sweeties[$k]{name}, 1 == $j? "\n": ", " if $j & 1;
}
print "Masse: ", $best{g}, " g\n",
"Nährwert: ", $best{kcal}, " kcal\n";
Mal schauen ob ich noch Zeit und Muße finde, mir schwirren da schon ein paar Optimierungen durch den Kopf...
Bis dahin -
Gruß
Enum