Knobelaufgabe

stringzz

Mitglied
Hi! Ich soll zum ersten Mal eine Knobelaufgabe in Java lösen..
Aufgabenstellung:
In einer Gärtnerei arbeiten Männer und Frauen. Am Tag der offenen Tür bring ein drittel der Mitarbeiter/innen ihre Kinder mit. Männer pflanzen pro Tag 13 Bäume, Frauen 10 und Kinder 6. Insgesamt werden 159 Bäume gepflanzt. Ermitteln Sie die Anzahl der Männer, Frauen und Kinder. (Hinweis: Es gibt nur eine richtige Lösung

Hänge seit einer Stunde dran und weiß einfach nicht mehr weiter...

Mein bisheriger Code:

Java:
package Uebung;

import static pr.MakeItSimple.println;

public class Gärtnerei {

    public static void main(String[] args) {

        int anzahlMänner = 1;
        int anzahlFrauen = 1;
        int anzahlKinderMänner = (1 / 3) * anzahlMänner;
        int anzahlKinderFrauen = (1 / 3) * anzahlFrauen;

        int männerPflanzen = 13; // 1 Mann = 13 Bäume
        int frauenPflanzen = 10; // 1 Frau = 10 Bäume
        int kinderPflanzen = 6; // 1 Kind = 6 Bäume
        int maxBäume = 159; // Maximal Anzahl gepflanter Bäume

//    13x + 10y + 6z = 159

        for (männerPflanzen = 13; männerPflanzen <= 159; männerPflanzen *= 2) {
            for (frauenPflanzen = 10; frauenPflanzen <= 159; frauenPflanzen *= 2) {
                for (kinderPflanzen = 6; kinderPflanzen <= 159; kinderPflanzen *= 2) {
                    if (männerPflanzen + frauenPflanzen + kinderPflanzen >= 159) {
                        println("Ergebnis" + männerPflanzen + frauenPflanzen + kinderPflanzen);
                    }
                }
            }
        }

    }

}

Wollte ne for-Schleife haben, bei dem die gepflanzten Bäume der Männer = 13, Frauen = 10 und Kinder = 6 sind. MIt den Anzahl der angepflanzten Zahlen würde ich dann die Anzahl der Männer etc. berechnen.
Aber habe das 1/3 gerade nirgends mitbezogen...
Weiß nicht mal ob dieses Forum dafür geeignet ist oder ich ein Mathe bzw. Knobelaufgabe Forum aufsuchen sollte :D:D

Aber evtl. kann mir ja jemand weiterhelfen :) Danke!
 

httpdigest

Top Contributor
Die Aufgabe ist mehrdeutig formuliert, bzw. nicht exakt so, wie sie vermutlich gemeint ist.
Der Satz: "Am Tag der offenen Tür bringt ein Drittel der Mitarbeiter/innen ihre Kinder mit." hat in dieser Form keinen Informationsgehalt. Nur, weil eben ein Drittel der MitarbeiterInnen ihre Kinder mitbringen, weiß man noch nicht, wieviele Kinder denn kommen, da man nicht weiß, wieviele Kinder denn jeder Mitarbeiter bzw. jede Mitarbeiterin genau hat und mitbringt.
Wenn man jetzt davon ausgeht, dass jeder der MitarbeiterInnen, die Kinder mitbringen, eben genau ein Kind mitbringt, dann ist die Lösung des folgenden Gleichungssystems gesucht:
Code:
159 == m*13 + f*10 + k*6
k == (m + f) / 3
mit m = Anzahl Männer, f = Anzahl Frauen und k = Anzahl Kinder
und m, f, k sind natürliche Zahlen

EDIT: Wolfram Alpha Lösung
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Die Mathematische Frage ist doch erst einmal einfach zu formulieren:
anzahlMaenner * 13 + anzahlFrauen * 10 + anzahlKinder * 6 = 159.

Nun kannst Du das austesten. Aber da frage ich mich, was Du da probierst... Die Anzahl der Bäume, die die Männer pro Tag pflanzen, ist doch konstant bei 13. Also solltest Du den Wert nie ändern und am besten final machen - dann kannst Du ihn auch nicht verändern.

Und nun können wir rumprobieren. Die Anzahl kann entweder 0 sein oder eine maximale Zahl. Die maximale Zahl kann man berechnen: Wie viele Männer können es maximal sein? Hast Du da eine Idee der Berechnung?
==> Da bekommst du also fixe Werte für maxAnzahlMaenner, maxAnzahlFrauen und maxAnzahlKinder.

Dann kannst Du nun 3 Schleifen laufen lassen:
anzahlMaenner von 0 bis maxAnzahlMaenner
anzahlFrauen vergleichbar und ebenso für die Kinder ...

In den verschachtelten Schleifen kannst Du nun die Rechnung oben prüfen - wenn diese Rechnung stimmt, gibst Du die anzahl für Maenner, Frauen und Kinder aus.

Und dann kannst Du das auch noch Optimieren.
Wenn Du eine anzahlMaenner und anzahlFrauen hast, dann kannst Du die Formel ja umstellen. Eine Formel mit einer Unbekannten ist ja lösbar. Da ist dann also etwas anderes abzuprüfen....

Edit: In der Schleife ist natürlich die zweite Bedingung ebenfalls zu prüfen. Das habe ich dann vor lauter herunterschreiben vergessen zu erwähnen ....
 

stringzz

Mitglied
Danke Euch beiden! Habs jetzt auch endlich geschafft ^^

Java:
public class Gärtnerei {

    public static void main(String[] args) {

        knobel();

    }

    public static void knobel() {

        for (int mann = 0; mann < 159 / 13; mann++) {
            for (int frau = 0; frau < 159 / 10; frau++) {
                for (int kind = 0; kind < 159 / 6; kind++) {
                    if (13 * mann + 10 * frau + 6 * kind == 159) {
                        if ((mann * 13) + (frau * 10) + (kind * 6) == 159 && kind == (mann + frau) / 3) {

                            println("Männer: " + mann + " Frauen: " + frau + " Kinder: " + kind);
                        }
                    }
                }
            }
        }
    }
}

Kriege 5 Männer, 7 Frauen und 4 Kinder raus :) Passt.
 

White_Fox

Top Contributor
Es gibt nur eine richtige Lösung
Dann müßte man definieren, was eine richtige Lösung sein soll. Eine Gleichung zu ermitteln die zur mathematisch richtigen Lösung führt kann es schonmal nicht sein, denn:

3 Männer + 12 Frauen -> würden 159 Bäume pflanzen können
1 Mann + 8 Frauen + 11 Kinder -> würden 159 Bäume pflanzen können

und es gibt noch mehr Kombinationen, die die Forderung "159 Bäume" erfüllen würden.

Und es gibt garantiert auch mehrere Möglichkeiten, ein Programm zu schreiben daß eine korrekte Lösung ermittelt. Das einfachste dürfte eine schnöde Bruteforceimplementierung sein:

Java:
public class PossibleSolution{
    int men;
    int women;
    int children;
   
    public PossibleSolution(int men, int women, int children){
        this.men = men;
        this.women = women;
        this.children = children;
    }
}

public static void main(String args[]){
    final int treeSolution = 159;
    final int treePerMan = 13;
    final int treePerWoman = 10;
    finals int treePerChild = 6;
   
    ArrayList<PossibleSolution> solutions = new ArrayList<>();
    int sum = 0;
    for(int men = 0; men * treePerMan >= treeSolution; men++){
        for(int women = 0; women * treePerWomane >= treeSolution;f women++){
            for(int children = 0; children * treePerChild >= treeSolution; children++){
                sum = men * treePerMan + women * treePerWoman + children * treePerChild;
                if(sum == treeSolution){
                    s = new PossibleSolution(men, women, children);
                    solutions.add(s);
                }
            }
        }
    }
    System.out.println("Gefundene Lösungen: " + solutions.size());
    System.out.println("Lösungen:");
    for(PossibleSolution s : solutions){
        System.out.println("Männer: " + s.men + "; Frauen: " + s.women + "; Kinder: " + s.children);
    }
}

Edit:
Mist, zu spät, jetzt bist du selber dahinter gekommen.

Allerdings hängt es jetzt noch von der Reihenfolge der Schleifen ab, welche Lösung die erste ist.
 

Blender3D

Top Contributor
Am Tag der offenen Tür bring ein drittel der Mitarbeiter/innen ihre Kinder mit.
Aus dieser Angabe kann man keine Bedingung ableiten. z.B. Kind == (man+frau) / 3 lässt außen vor, dass ein Vater und eine Mutter z.B. 5 Kinder haben, die sie mitbringen. Was der obige Text nicht ausschließt.
Peter, Susi haben 2 Kinder
Hannes, Maria haben 0 Kinder
Muhamed und Aishe haben 3 Kinder
Nur Muhamed und Aishe bringen ihre Kinder mit.
(3 Männer + 3 Frauen)/3 = 2 Kinder. Aber wir haben hier 3 Kinder. Also ist die obige Bedingung nicht korrekt.
 

httpdigest

Top Contributor
Korrrekt. Wie ich schon schrieb, muss man annehmen, dass jeder der MitarbeiterInnen, die Kinder mitbringen, genau ein Kind hat, welches sie/er mitbringt.
Die notwendige Bedingung, die diese Annahme korrekt erscheinen lässt, ist der Satz: "Es gibt nur eine richtige Lösung."
Denn nur dann gibt es auch genau eine Lösung bei den gegebenen Werten.
 

White_Fox

Top Contributor
Peter, Susi haben 2 Kinder
Hannes, Maria haben 0 Kinder
Muhamed und Aishe haben 3 Kinder
Nur Muhamed und Aishe bringen ihre Kinder mit.
Dann wäre noch die Frage zu klären, ob Muhamed UND Aishe, oder Muhamed ODER Aishe in der Baumschule arbeiten. In jedem Fall wären zwar drei Kinder dabei, aber die Prüfungsbedingung ist eine andere (und auch nicht aus der Aufgabe abzuleiten).
 

httpdigest

Top Contributor
Männer: 3
Frauen: 6
Kinder: 10
3x13+6x10+10x6 = 159
3 Erwachsene von 9 Erwachsenen bringen 10 Kinder mit ist eine Lösung.
Das ist eine Lösung, es ist aber nicht die einzige Lösung! Es geht darum, dass es eben nur eine einzige Lösung gibt, also eine einzige Belegung der Variablen so dass die Gleichungen erfüllt sind. Deswegen ist deine Lösung bzw. dein Gleichungssystem eben keine Lösung für die gesamte Aufgabenstellung.
 
K

kneitzel

Gast
Aber nur wenn die 1/3 der 9 Erwachsenen zusammen 10 Kinder haben. Das ist die Problematik, die in #6/#7 noch einmal erläutert wurden....
 

httpdigest

Top Contributor
Ich glaube, hier gibt es ein Mißverständnis darüber, was der Satz "Es gibt nur eine richtige Lösung." genau bedeutet. Mit Lösung ist die korrekte Variablenbelegung (Anzahl Männer, Anzahl Frauen, Anzahl Kinder) gemeint und nicht das Programm selbst, um diese Belegung zu berechnen/ermitteln.
Der Hinweis "Es gibt nur eine richtige Lösung." soll also heißen: Wenn Ihr Programm mit Rechnen fertig ist, soll nur eine einzige Konfiguration der Variablen (Anzahl Männer, Anzahl Frauen, Anzahl Kinder) herauskommen, die die genannten Bedingungen erfüllen.
Wenn das Programm also mehrere mögliche Konfigurationen ermittelt, sind offensichtlich die modellierten Bedingungen bzw. das modellierte Gleichungssystem falsch bzw. nicht entsprechend der Aufgabenstellung.
 

Blender3D

Top Contributor
Aber nur wenn die 1/3 der 9 Erwachsenen zusammen 10 Kinder haben. Das ist die Problematik, die in #6/#7 noch einmal erläutert wurden....
Dann setzte ich genau so eigenmächtig voraus, dass im Betrieb nur Paare arbeiten -> #Männer == #Frauen
Ich erhalte die eindeutige Lösung:
Männer: 3 Frauen: 3 Kinder: 15
Also 1 Paar nimmt seine 15 Kinder mit ;)
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben