C# Programm das gerecht Verteilen kann?
Hallo Leute, ich hoffe euch geht's gut.
Ich bin noch ziemlich neu hier und auch in der Welt von C# nicht gerade der Profi, aber ich liebe es, in meiner Freizeit zu programmieren.
Vor ein paar Wochen habe ich mit C# angefangen und arbeite jetzt an einem Projekt für eine App. Ich tüftle an einem Programm, das verschiedene Dinge (zum Beispiel 3 Tomaten, 4 Bananen und 6 Äpfel) gerecht auf eine festgelegte Anzahl von Tüten verteilt (sagen wir 3 Tüten).
Die Gesamtanzahl jeder Obstsorte und die Gesamtanzahl der Dinge insgesamt dürfen sich höchstens um eins unterscheiden, damit es für jede Tüte so fair wie möglich bleibt.
Mein Ansatz ist, eine Liste von Integer-Arrays zu erstellen, die ich
bags
nennen würde.Jeder Teil dieser Liste würde dann ein Integer-Array beinhalten, in dem die Gegenstände für jede Tüte gespeichert werden.
Versteht ihr, worauf ich hinauswill? Ich könnte echt eure Hilfe gebrauchen und wäre dankbar für eure Gedanken dazu, wie ich am besten vorgehen sollte. Sollte ich die Anzahl der Dinge teilen oder wie würdet ihr das angehen? Bin gespannt auf eure Vorschläge! Danke schon mal im Voraus.
Mein C# Code Ansatz:
// Online C# Editor for free
// Write, Edit and Run your C# code using C# Online Compiler
using System;
public class HelloWorld
{
public static void Main()
{
double[] objects = new double[]{4,4,2};
Pack(objects, 3);
}
public static void Pack(double[] things, int numBags)
{
double[] results = new double[]{0,0,0};
double[] sumUp = new double[]{0,0,0};
for(int i = 0; i < things.Length; i++)
{
double current = things[i] / numBags;
double nextnumber = (double)Math.Floor(current);
results[i] = current;
double part = current - nextnumber;
sumUp[i] = part;
Console.WriteLine(results[i] + "/" + Math.Floor(current) + "/" + part);
}
for(int b = 0; b < sumUp.Length; b++)
{
sumUp[b] = sumUp[b] * numBags;
Console.WriteLine(sumUp[b]);
}
}
}
2 Antworten
Ich verzichte auf eine "Rahmenstruktur" mit verschiedenen "Früchten". Es geht ja schließlich nur um das möglichst gleichmäßige verteilen auf eine Liste (Kinder).
Das diese Methode benutze ich gewöhnlich unter Powershell um große (Datei)Listen auf mehrere Jobs zu verteilen. https://www.gutefrage.net/frage/die-ersten-20-zeilen-von-txt-datein-automatisch-loeschen-lassen#answer-518577030
Ob man nun Dateien auf Jobs verteilt, oder Bananen auf Kinder ist dabei unerheblich...
Long habe ich Verwendet damit Du auch Reiskörner auf die Weltbevölkerung verteilen kannst...🤣
using System;
using System.Collections.Generic;
class Prog{
public static List<long> getParts( long Size , long Parts ){
List<long> p = new List<long>(); //liste, welche die einzelnen Teile zwischenspeichert
long Teil = (long) Math.Floor((decimal)Size / Parts); //Anzahl bei gleichmäßiger Verteilung (abrunden!)
long Rest = Size % Parts; //Rest, der sich nicht geichmäßig verteilen ließ
for (long i=0;i<Parts;i++){ //verteile den den Rest
if ( Rest > 0 ){ //solange noch was übrig ist
p.Add( Teil + 1 ); //...Teil + 1 in Liste speichern
Rest--; // Rest um 1 reduzieren
}
else p.Add( Teil ); //ist vom Rest nichts mehr übrig, ursprüngliche Teilmenge in Liste.
}
return p; //Liste als Ergebnis der Methode zurückgeben
}
public static void Main(string[] args){
int AnzahlKinder = 3;
int AnzahlAepfel = 2;
Console.WriteLine("Verteilung der Äpfel auf die Kinder");
foreach (long Kind in getParts(AnzahlAepfel,AnzahlKinder)){
Console.WriteLine(Kind);
}
int AnzahlBananen = 22;
Console.WriteLine("Verteilung der Bananen auf die Kinder");
foreach (long Kind in getParts(AnzahlBananen,AnzahlKinder)){
Console.WriteLine(Kind);
}
Console.ReadKey();
}
}
Danke, das hat mich echt weitergebracht. Jetzt ist nur das Problem: Die Gesamtzahl von Obst und die Obstart wie viel jedes Kind bekommt darf sich höchstens um 1 ändern. Wie könnte ich das erfragen und dann in der Verteilung korrigieren?
Ein erster einfacher Ansatz wäre der, je Obstsorte so oft über die vorhandenen Tüten zu iterieren (und dabei jeweils eine Frucht hineinzulegen), bis es keine verfügbaren Früchte der Sorte mehr gibt.
Wenn es dabei mehr Tüten als Früchte je Sorte gibt (bei deinem Beispiel wäre das z.B. ab vier Tüten der Fall), würde das allerdings auch bedeuten, dass einzelne Tüten stets leer ausgehen. Es sei denn, du zerlegst erst die Früchte (Anzahl Früchte / Anzahl Tüten) und teilst die Fragmente anschließend entsprechend auf.
So lange du nichts zerlegst, also nicht mit Fließkommazahlen arbeitest, wäre der Typ int statt double eher angebracht. Das du als Anfänger ein Array wählst, um die Mengen zu repräsentieren, ist in Ordnung.
Sobald du dich mit Collections oder dem Schreiben eigener komplexen Datentypen beschäftigst, wäre ein Dictionary / eine Klasse besser geeignet, da du die Zahlen dann einem besser verständlichen Key zuordnen kannst.