Mengen und Rest gleichmässig verteilen.

Joe

Erfahrenes Mitglied
Ich versuche eine gegebene Menge zb 0.5l Wasser auf eine gegebene Anzahl Behälter zu verteilen zb 2Flaschen.
Die minimale Einheit ist 0.1l es gibt also keine 0,05l oder 0.25l.

Irgendwie breche ich mir einen ab so eine simple Aufgabe zu lösen.
Hier mal mein Versuch:
PHP:
				$Inhaltneu=array();
				$gesamt=$Inhalt;
				$Anz=$Anzahl;
				$Wert=0;
				while ($flag==false) {
					if (0>$gesamt-0.1*$Anz) {
						$Wert++;
						$Anz--;
						if ($Anz==0) {
							break;
						}
					}
					if ($gesamt>=0.1*$Anz) {
						for($j=$Wert; $j<$Anz; $j++){
							$Inhalts=$Inhaltneu[$j];
							
							$Inhaltneu[$j]=$Inhalts+0.1;
							echo "<p>$Inhaltneu[$j]</p>";
						}
					}
					$Different=0.1*$Anz;
					if ($gesamt-$Different==0) {
						echo "<p>TEST2:</p>";
						$flag=true;
						break;
					}
					$gesamt=$gesamt-$Different;
					echo "<p>Gesamt:$gesamt Minus Different:$Different</p>";
					if ($gesamt<=0.09) {
						$flag=true;
						break;
					}
					
					//// Dies trifft nie ein
					//// statt Null taucht eine utopische Zahl auf
					//// 2.77555756156E-16
					if ($gesamt==0) {
						$flag=true;
						break;
					}
				}
		



				for($j=0; $j<$Anzahl; $j++){
					for($i=0; $i<$Faecher; $i++){	
						if (!isset($ItemsUnSerialize[$i])) {
							$ItemsUnSerialize[$i][0] = $IsItem;
							$ItemsUnSerialize[$i][1] = $Inhaltneu[$j];
							break;
						}
					}
				}

Irgendwie nehme ich an das ich das nicht nur falsch mache sondern völlig unötig unperformant. Vieleicht kann jemand von euch das viel einfacher oder kürzer lösen.
 
Welche und wieviele Behältergrößen gibt es denn ?
bzw wie stellst du dir das genau vor soll am schluss herauskommen.
0,5 l = 5*0,1l flasche 3*0,2l flasche 1*0,5l flasche oder wie meinst du das genau ?

mfg
 
In einem andren Script wurde vorher überprüft ob die Mengen überhaupt in die Behälter reinpassen können.
Die Menge passen also immer in die gegebene Anzahl Behälter.

Als Bspl: 1Paket auf dem Markt hätte als Angebot 2 Flaschen(Platz jeweils 1l) und eine Wasermenge von 0,5l.

Ich möchte nun die Gesammenge verteilen auf die 2 Flaschen so das eine Flasche 0.2l hat und die andre 0.3l.
Dann wird das ganze ins Gepäck geworfen.

Andres Bspl: 1Paket auf dem Markt hätte als Angebot 4 Flaschen(Platz jeweils 1l) und eine Wasermenge von 3,5l.

Ich möchte nun die Gesammenge verteilen auf die 4 Flaschen so das eine Flasche 0,8l hat, die 2.eFlasche 0,9l.
3.Flasche 0,9 4.e Flasche 0,9l
Dann wird das ganze ins Gepäck geworfen.
 
Zuletzt bearbeitet:
Eigentlich sollte das doch ganz einfach sein. Dachte anfangs etwa so:

Menge pro Behälter=Gesamtmenge/Anzahl Behälter
Menge pro Behälter auf eine Stelle nach Komma abrunden.
Restmenge auf Behälter verteilen bis Restmenge alle.

einzige Bedingung ist das es halt immer nur eine Stelle nach dem Komma sein muss.
Nur hänge ich genau bei so einen eigentlich einfachen mathematischen Problem :)

Wie ich das ganze in arrays oder ins Gepäck bekomme ist dabei einfach nur die schlichte Verteilung da denke ich wohl zu kompliziert.
 
Zuletzt bearbeitet:
Nur so mal aus den arm geschüttelt.. kann evtl fehler enthalten oder was ganz anderes sein als du brauchst

PHP:
<?php
$liter = 3.5;
$behaelter = 4;

$faktor = 10;
$var = $liter * $faktor;
$var = round($var / $behaelter);
$kleinemenge = $var / $faktor;
$behealter2 = $behaelter -1;
$rest = $liter - ($behealter2 * $kleinemenge);

echo $kleinemenge." in ".$behealter2." behälter";
echo "<br>";
echo $rest." in einen behälter";
?>
 
  • Gefällt mir
Reaktionen: Joe
Doch doch ist schon ganz gut nur könnte es passieren das der Rest 0 oder weniger wird (grob überblickt).
Nur einer meiner Behälter die Flasche ist eben Einweg :D heisst darf nicht null sein wäre kaputt.
Aber ich kam auf eine ähnliche Idee grad.
Muss es nur noch in entsprechendes Array packen:
PHP:
				$MengeProBehälter=$gesamt/$Anz;
				$MengeProBehälterabgerundet = floor($MengeProBehälter*10)/10;
				$Rest=$gesamt-$MengeProBehälterabgerundet*$Anz;
				// Rest noch verteilen bis leer
 
Alter Schwede also PHP hat da echt Probleme beim dividieren und runden.
Wenn das Ergebniss eine Zahl mit Periode ist ist hier Schluss und wirft unmögliche Ergebnisse. Man würde nie auf eine logische Zahl 0 kommen. Zwar wäre die Ausgabe richtig aber intern scheint die Zahl dennoch anders zu lauten.

Wenn das Problem bekannt ist frage ich mich wieso es eigentlich überhaupt noch existiert oder ist das in allen Programmiersprachen ein Problem?

Ich konnte das Problem nur löse in dem ich zu erwartende Kommazahlen eben mit 10 oder 100 multipliziere so das es eben erst mal keine Komazahl(float) mehr ist.
Ist mir irgendwie suspeckt das ganze :)
PHP:
				$Inhaltneu=array();		
				$gesamt=$Inhalt*10;
				$MengeProBehälter=$gesamt/$Anzahl;
				if (is_float($MengeProBehälter)) {
					$MengeProBehälterabgerundet = floor($MengeProBehälter);
				}
				else {
					$MengeProBehälterabgerundet =$MengeProBehälter;
				}
				$Rest=$gesamt-$MengeProBehälterabgerundet*$Anzahl;
				var_dump($MengeProBehälterabgerundet);
				for($j=0; $j<$Anzahl; $j++){
					if ($Rest!=0) {
						$MengeProBehälterabgerundet=$MengeProBehälterabgerundet/10;
						$Inhaltneu[$j]=$MengeProBehälterabgerundet+0.1;
						$Rest=$Rest-1;
					}
					else {
						If (!is_float($MengeProBehälterabgerundet)) {
							$MengeProBehälterabgerundet=$MengeProBehälterabgerundet/10;
						}
						$Inhaltneu[$j]=$MengeProBehälterabgerundet;
					}
					echo "<p>$Inhaltneu[$j]</p>";
				}
		
				for($j=0; $j<$Anzahl; $j++){
					for($i=0; $i<$Faecher; $i++){	
						if (!isset($ItemsUnSerialize[$i])) {
							$ItemsUnSerialize[$i][0] = $IsItem;
							$ItemsUnSerialize[$i][1] = $Inhaltneu[$j];
							break;
						}
					}
				}
 
Zurück