Python Programmieren?
Hallo Zusammen!
Ich habe eine Aufgabe im Informatik Unterricht bekommen welche ich einfach nicht lösen kann. Und zwar soll ich in Python ein Programm schreiben welches mir von meinen eingegeben Betrag die Mindestanzahl der Münzen nennt, welche diesen Betrag bilden. Also z.B 1,02€ sind eine 1€ Münze und eine 2 Cent Münze. Das ganze soll ich mit Funktionen machen. Kann mir irgendwer die Lösungen zu diesem Beispiel nennen, danke im Vorhinein!
Lg
3 Antworten
Du hast nen Tupel mit den Münzwerten, von groß nach klein. Du iterierst über die Münzwerte und machst dabei folgendes:
- Ermittle wie oft die Münze in den Betrag passt.
- Ziehe das PRodukt aus Münzert und Anzahl vom Gesamtbetrag ab
- Wiederhole für alle Münzwerte
Praktisch ist in diesem Zusammenhang divmod(), weil es Dir die Subtraktion erspart.
Ich fange mal mit einem Lösungsansatz an - über Rekursion mit einer kleinen Erweiterung (ähnlich "branch and bound").
Grundgedanke der Rekursion:
minAnzahl(betrag) -> verfügbareMünzen.min(münze -> minAnzahl(betrag - münze.wert)) + 1
Dabei muss man noch dafür sorgen, dass minAnzahl für betrag = 0 auch 0 zurückgibt und für betrag < 0 "ungültig".
Damit funktioniert das Programm schon mal, ist aber sehr ineffektiv. Wesentlich besser ist es, eine "Map" mitzuschleppen, die die bisher berechneten Mindestanzahlen für bestimmte Beträge behält und "ungültig" zurückgibt, sobald diese Anzahl überschritten würde. Eine weitere Verbesserung wäre, die Münzen nach Wert absteigend zu ordnen und nur Münzen zuzulassen, deren Wert nicht größer ist als der Wert der zuletzt probeweise hinzugefügten Münze - auf die Reihenfolge der Münzen kommt es ja nicht an. Ob es möglich ist, alle Münzen mit einem kleineren Wert, als in den Restbetrag passt, unberücksichtigt zu lassen, müsste auf mathematischem Weg bewiesen werden.
Du musst eine Schleife programmieren, die, beginnend mit der größten Münze (2€) versucht ob der Betrag noch größer als der Münzwert ist. Falls ja, Münze merken, Wert abziehen.
Sobald das nicht mehr geht, Wert unter 2€, mit der nächst kleineren Münze (1€) fortfahren.
Nur eine Korrektur. Die "bestmögliche " Menge bekommt man mit einer Division, bei der man das Ergebnis abrundet. Mit Modulo bekommt man der Restbetrag um weiter zu rechen.
Ich würde es mit modulo machen, da ich dort direkt die maximale und somit bestmögliche Menge einer Münze erhalte. Ansonsten ist das Vorgehen perfekt!