Schulaufgabe die mir den Kopf zerbricht. :(



  • Hallo!
    Da ich Technische Informatik studiere, wurde ich gerade von einem bekannten gefragt, ob ich ihn bei folgender Aufgabe helfen könne:
    **
    ein mann besizt ein theater mit 100 plätzen. das theater wird von 100 zuschauern besucht. die eintrittspreise betragen 5 cent für männer 2 cent für frauen und 1 cent für je 10 kinder. die gesamteinnahme beträgt 1 dollar. wie viele frauen und männer und kinder sind im theater?
    **
    Es sind also 3 unbekannte gesucht und demnach 3 Gleichungen aufzustellen.
    Eine ist m+f+k=100 (männer + frauen + kinder = 100 Plätze)
    Die andere ist 5m+2f+0.1k=100cent
    aber vielleicht liegt auch da bereits mein Denkfehler.

    Wahrscheinlich muss man noch irgendwie berücksichtigen, dass immer nur 10ner packs von kindern ins theater dürfen. Es wäre demnach also nicht möglich dass nur 8 oder 15 drinn säßen, sondern immer nur 10, 20, 30 usw...
    Außerdem ist bekannt, dass mindestens 1 Mann unter den Zuschauern sein muss und dass 100cent verdient werden, bei 100 Zuschauern.
    Nur wie???

    Ich habe ein kleines Programm geschrieben, welches alle Möglichkeiten durchprobiert und ich erhielt damit folgendes Ergebnis zum vergleichen:
    11 Männer, 19 Frauen und 70 Kinder.
    Was mich nun interessieren würde, wäre der Rechenweg. Weiß jemand rat?

    Hier noch mein Programm ^^:

    #include "stdafx.h"
    #include <iostream.h>
    
    int main(int argc, char* argv[])
    {
    	const int Plaetze   = 100;
    	const int Einnahmen = 100; //cent 
    	int momentanEinnahmen = 0;
    
    	//Preise in cent
    	int preisMann = 5;
    	int preisFrau = 2;
    	int preisZehnKinder = 1;
    
    	int Maenner = 1;
    	int Frauen  = 0;
    	int Kinder  = 0;
    
    	while(Maenner*preisMann < Einnahmen)
    	{
    		momentanEinnahmen = Maenner*preisMann + Frauen*preisFrau + Kinder*preisZehnKinder/10; 
    
    		if(Maenner + Frauen + Kinder == 100)
    		{
    			if(momentanEinnahmen == Einnahmen)
    			{
    				cout << "Die lösung ist: " << Maenner << " Maenner, " << Frauen << " Frauen und " << Kinder << " Kinder.";
    				break;
    			}
    		}	
    
    		if(Maenner + Frauen + Kinder+10 > 100)
    		{
    			Frauen++;
    			Kinder = 0;
    
    			if(Frauen + Maenner == 100)
    			{
    				Maenner++;
    				Frauen = 0;
    			}
    		}
    		else
    			Kinder+=10;
    	}
    
    	return 0;
    }
    


  • Wenn Du k nicht als Anzahl der Kinder nimmst, sondern als Anzahl der Zehnerpacks von Kindern (erste Bedingung entsprechend anpassen), dann hast Du also ein LGS mit 2 Gleichungen und zwei Unbekannten, mit der Zusatzedingung, dass die Lösung ganzzahlig und positiv sein muß. So eine Ganzzahligkeit mathemathisch zu behandeln ist meistens extrem schwer. Mit elementaren Methoden bleibt einem kaum was anderes übrig, als zumindest ein paar Lösungen durchzuprobieren. Du könntest zum Beispiel das LGS lösen (du bekommst eine 1-dimensionale Lösung) und anschließend eine ganzzahlige Lösung suchen, bei der alle Koordinaten positiv sind, indem Du Deinen 1-dimensionalen Lösungsraum absuchst.

    Alernativ kannst Du zum Beispiel die Anzahl der Kinder in 10er-Schritten durchprobieren, das entsprechende k einsetzen und schauen, ob das verbleibende LGS eine ganzzahlige positive Lösung hat. (die ist ja dann eindeutig bestimmt, daher muß da nichts mehr durchprobiert werden).



  • Diese Idee mit dem Lösungsraum absuchen ist eigentlich ne Super-Idee. Wenn du dieses GS auflöst und k durch 10t = k ersetzen:

    m + f + 10t = 100
    5m + 2f + t = 100

    bekommst du einen eindimensionalen Lösungsraum:

    m = (19t - 100) / 3
    f = (400 - 49t) / 3

    t ist einer der ganzen Zahlen im Intervall [1, 9] laut Aufgabe.
    Wenn du noch die Bedingung m, f > 0 hinzufügst:

    19t - 100 > 0
    =>
    t >= 6

    400 - 49t > 0
    =>
    t <= 8

    Also bleibt nur noch das Intervall [6, 8].. naja und diese 3 Zahlen.. ausprobieren



  • Die Einschränkung des Suchraums durch die Constraints m,f>=0 ist ne tolle Idee. 👍


Anmelden zum Antworten