Hi,
Soweit verstehe ich es. Aber nun ändere ich die Schnittlänge auf 2001 und erhalte:
Ups, ja das war ein Schusslichkeitsfehler bei der Ausgabe. Der Fehler dürfte jetzt aber behoben sein. Der vorher gepostete Code und der Link stimmen immernoch, aber ich erweitere mal den gezeigten Code um ein paar Zeilen, damit er verständlicher wird.
echo "<p>Es sollen $count Stücke der Länge $laenge aus den Rohstücken ".implode(', ',$roh).' geschnitten werden.</p>';
$roh_count=count($roh);
$min_rest=-1;
while($kombi[$roh_count-1]<=$count){
//Neue Kombination berechnen
$kombi[0]++;
for($j=0;$j<$roh_count-1;$j++)
if($kombi[$j]>$count){
$kombi[$j+1]++;
$kombi[$j]=0;
}
//Überprüfen, ob diese Kombination die gewünschte Anzahl an fertigen Stangen ergibt
$anzahl=0;
foreach($kombi as $par_anzahl)
$anzahl+=$par_anzahl;
if($anzahl!=$count)//Wenn nicht -> neue Kombination
continue;
//Rest dieser Kombination berechnen
$rest=0;
for($i=0;$i<$roh_count;$i++){
$a=ceil($kombi[$i]/floor($roh[$i]/$laenge));//Soviele Rohstücke dieser Länge brauche ich
$rest+=$a*$roh[$i] - $kombi[$i]*$laenge;
}
//Wenn neuer Minimalwert erreicht -> merken
if(($rest<$min_rest)||($min_rest<0)){
$min_kombi=$kombi;
$min_rest=$rest;
}
}
//Ausgabe
echo "<p>Benutze</p>
<ul>";
for($i=0;$i<$roh_count;$i++){
$a=ceil($min_kombi[$i]/floor($roh[$i]/$laenge));//Soviele Rohstücke dieser Länge brauche ich
echo "<li>$a mal ".$roh[$i]."er Stange(n).</li>\n";
}
echo "</ul>\n<p>Dabei entsteht ein Rest von $min_rest.</p>\n";
4 Stücke á 2001 aus 2 Stangen á 2050 .. du bist ein Genie. Sämtliche Materialeinkäufer werden dich wegen drastisch gesunkener Materialvorhaltung geradezu verehren ;)
Die alte Version lässt sich garantiert besser verkaufen, da hast du Recht. :)
Gruß,
Felix
--
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist überzeugt, dass er genug davon habe.
René Descartes
Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jedermann ist überzeugt, dass er genug davon habe.
René Descartes