Wechselgeld 5 besten Kombinationen



  • Geht leider trotzdem nicht.



  • Das ist ja auch nicht der Sinn dieses Forums, dass man per PN Lösungen versendet. Der Nächste, der dieses Problem hat, kann nicht von der Lösung profitieren, weil er sie nicht sieht.
    Normalerweise sieht das so aus, dass TE die Aufgabenstellung mit seinem bisherigen Ansatz postet und Fragen dazu stellt. Daraufhin gibt es Denkanstösse oder Hinweise, wie man zur Lösung kommen kann oder die bisherige Lösung verbessern kann. Beides erfordert auf jeden Fall Arbeit des TE und soll TE dazu bringen, die Lösung selbst zu finden. Der Lerneffekt ist dann deutlich höher als bei einer fertigen Lösung, und TE ist danach hoffentlich in der Lage, ähnliche Probleme selbst zu lösen.

    Warum EinNutzer0 seine Lösung per PN schicken möchte könnte damit zusammenhängen, das seine bisherigen Vorschläge zerpflückt worden sind, aber das ist nur nur eine Vermutung 😉


  • Gesperrt

    Dieser Beitrag wurde gelöscht!


  • @DocShoe
    Ich will doch keine fertige Lösung, wie oft soll ich das noch hier reinschreiben???
    Deine Beitrag hilft mir gar nicht.

    Ich komme nun mal nicht auf die Funktion und bräuchte da eine Hilfestellung...
    Mit Brute Force komme ich ja anscheinend nicht sehr weit.
    Dieses Thema ist ja auch nicht erst seit heute drin.



  • @EinNutzer0
    Hab dir ne Mail geschickt.


  • Gesperrt

    @codinglea sagte in Wechselgeld 5 besten Kombinationen:

    Hab dir ne Mail geschickt

    Danke, und hab auch schon geantwortet


  • Gesperrt

    Dieser Beitrag wurde gelöscht!


  • @titan99_
    Danke für den sinnvollen Beitrag!



  • @codinglea sagte in Wechselgeld 5 besten Kombinationen:

    mit dem Brute Force funktioniert es ja nur halbwegs...
    Da gibt es anscheinend auch 4€ und 3€ Münzen. 😅

    wo hast du die denn her? also du bist dir schon darüber im klaren, dass die zahlen, die da nachher ausgegeben werden, die anzahl der jeweiligen münzen und scheine darstellen? eine verständliche ausgabe wäre dann so ein beispiel für eine spätere verbesserung. also ich habe es ausprobiert und ich bekomme 5 lösungen.



  • @Wade1234
    Bei mir funtkioniert es gerade gar nicht mehr.
    EDIT: funktioniert wieder.



  • Also... wenn ich eine 5 eingebe als Betrag, dann kommt einmal 5x 1€ raus, 1x 5€ und 4x 2€, 3x 5€ und 2x 2€, 1x 10€ und 4x 2€ usw...



  • Mein Ansatz wäre folgender:

    1. Du bestimmst die optimale Kombination aus Scheinen/Münzen für die angeforderte Summe. Für den Euro gibt es 14 Einheiten (200, 100, 50, 20, 10, 5, 2, 1, 0.5, 0.2, 0.1, 0.05, 0.02, 0.01), eine Kombination der möglichen Scheine/Münzen lässt sich also in einem std::array<unsigned int> unterbringen.
    #include <array>
    #include <vector>
    
    // es gibt 14 verschiedene Scheine/Münzen
    static size_t const DenominationCount = 14;
    
    // in 1 Cent Einheiten
    using Denominations_t 			= std::array<unsigned int,DenominationCount>;
    Denominations_t CurrencyDenominations 	= {20000, 10000, 5000, 2000, 1000, 500, 200, 100, 50, 20, 10, 5, 2, 1 };
    
    Denominations_t calculate_denominations( unsigned int total )
    {
           Denominations_t retval;
           ...
           return retval;
    } 
    
    vector<Denominations_t> calculate_combinations( Denominations_t const& optimal )
    {
        ...
    }
    
    int main()
    {
        // optimale Stückelung des Betrags €157.23 bestimmen
        Denominations_t optimal = calculate_denominations( 15723 );
    
       // sämtliche mögliche Kombinationen bestimmen
       std::vector<Denominations_t > combinations = calculate_combinations( optimal );
    
       // Ausgabe, Bestimmung der besten Kandidaten, etc.
       ...
    }
    

    Die Funktion calculate_combinations lässt sich rekursiv über eine Hilfsfunktion lösen. Dabei kann z.B. ein Betrag von 15 Cent so dargstellt werden (verkürztes Array mit 5, 2 und 1 Cent):
    { 3, 0, 0 } -> 3x5 Cent, 0x2 Cent, 0x1 Cent. Wenn du eine 5 Cent Münze weniger nimmst kommst du zu folgender Kombination: { 2, 2, 1 }. Diese Stückelungen lässt sich dann wiederum als { 2,1,3 }, und { 2,0,5 } kombinieren. Dann nimmst du zwei 5 Cent Münzen weniger und kommst auf { 1,5,0}, was sich wiederum als { 1,4,2 }, { 1,3,4 }, { 1,2,6}, { 1,1,8} und { 1,0,10 } kombinieren lässt.
    Die Strategie ist also, angefangen mit der zweitniedrigsten Münze, die Münzen durch kleinere Münzen zu ersetzen und die sich Kombination zu merken. Das Ganze lässt sich prima rekursiv lösen.



  • @DocShoe
    Dass ich extra oben als Kategorie C angegeben habe, hast du gesehen?! 🙄



  • @codinglea
    Ne, habe ich nicht, Entschuldigung, aber das macht ja nix. std::array lässt sich 1:1 durch ein C-Array ersetzen, nur für vector brauchst du eine Alternative. Wenn du dir alle Kombinationen merken möchtest brauchst du was Vergleichbares. Oder du pflegst eine Top-5 Liste, die zunächst leer ist. Wenn du einen Kandidaten gefunden hast gibt´s dann zwei Möglichkeiten:

    1. es ist noch Platz in den Top-5: -> Kandidaten einfügen
    2. Top-5 ist voll: wenn der schlechteste Kandidat schlechter ist als die gefundene Kombination -> schlechtesten Kandidaten durch aktuelle Kombination ersetzen


  • Das hatten wir doch alles schon, hat der OP aber abegelehnt mit "hab ich noch nie benutzt und möchte ich drauf verzichten".

    https://i.chzbgr.com/full/2951494144/h7FAC4598/it-takes-skill



  • @hustbaer
    Nein, das meinte ich gar nicht. Ich glaube hier könnte ein Greedy Algorithmus funktionieren:

    Wenn wir die optimale Lösung suchen, so liefert uns der Greedy eine optimale Lösung. Wenn ich vom höchsten Schein her anfange meinen Betrag zu begleichen, so wird jede andere Lösung mehr Scheine benötigen.

    Bsp: 555€ = 1 * 500€ + 0 * 200€ + 0 * 100€ + 1 * 50€ + 1 * 5€ + ...

    Das Ganze kann man durch eine eine Reihe von Divisionen und Modulo Operationen berechnen.

    Wenn ich nun aber nicht mit dem 500€ Schein bezahlen möchte, muss ich die 500€ durch andere Scheine ersetzen. Dies kann ich aber auch genauso rechnen wie bei der optimalen Lösung.

    555€ = 2 * 200€ + 1 * 100€ + 1 * 50€ + 1 * 5€ + ...

    Ist im Endeffekt der gleiche Algorithmus wie der zur Berechnung der optimalen Lösung, nur das ich bei der Berechnung Scheine >= X ignoriere.

    Das bedeutet, wenn ich die zweitbeste Lösung bestimmen möchte, so berechne ich zuerst die optimale Lösung. Danach nehme ich den höchsten verwendeten Schein der optimale Lösung und berechne hierfür die optimale Lösung ohne das ich mit diesen nutze. Die zweitbeste Lösung entspricht dann der optimalen Lösung minus höchster Schein plus der optimalen Lösung für den höchsten Schein.

    Bsp.:

    Betrag = 555€

    Optimale Lösung = 1 * 500€ + 1 * 50€ + 1 * 5€

    Höchster Schein = 500€

    Optimale Lösung für 500€ ohne das ich diesen nutze = 2 * 200€ + 1 * 100€

    -> Zweitbeste Lösung = (1 * 500€ + 1 * 50€ + 1 * 5€) - 1 * 500€ + (2 * 200€ + 1 * 100€) = 2 * 200€ + 1 * 100 € + 1 * 50€ + 1 * 5€

    Das Ganze würde auch für die drittbeste Lösung mit 1055€ funktionieren:

    Optimale Lösung = 2 * 500€ + 1 * 50€ + 1 * 5€

    Höchster Schein = 2 * 500€

    Optimale Lösung für 2 * 500€ ohne das ich diesen nutze = 5 * 200€

    -> Drittbeste Lösung = (2 * 500€ + 1 * 50€ + 1 * 5€) - 2 * 500€ + (5 * 200€)



  • @Quiche-Lorraine sagte in Wechselgeld 5 besten Kombinationen:

    Wenn wir die optimale Lösung suchen, so liefert uns der Greedy eine optimale Lösung.

    Nur wenn man voraussetzt dass die Schein-Werte "vernünftig" gewählt wurden.

    Scheine: 100, 90, 20, 1
    Betrag: 110
    Optimale Lösung: 1x 90 + 1x 20
    Beste Greedy Lösung: 1x 100 + 10x 1



  • @hustbaer
    Mist, stimmt 😉



  • @Quiche-Lorraine sagte in Wechselgeld 5 besten Kombinationen:

    Das bedeutet, wenn ich die zweitbeste Lösung bestimmen möchte, so berechne ich zuerst die optimale Lösung. Danach nehme ich den höchsten verwendeten Schein der optimale Lösung und berechne hierfür die optimale Lösung ohne das ich mit diesen nutze. Die zweitbeste Lösung entspricht dann der optimalen Lösung minus höchster Schein plus der optimalen Lösung für den höchsten Schein.

    Das ist ebenfalls nicht korrekt, denn es hiess ganz oben mal, das die besten Lösungen sich über die Anzahl Scheine definieren. D.h. man muss wenn überhaupt nicht den größten Schein zerlegen, sondern einen, der sich mit möglich wenigen einzelnen Scheinen darstellen lässt.

    Aber auch das ist keine allgemeingültige Lösung, je nachdem was es für Werte gibt. Die Lösungen müssen überhaupt nicht "benachbart" sein und daher müssen dann alle Lösungen durchsucht werden, man kann dann maximal einen lower bound finden (e.g. hab 5 Lösungen mit max 10, brauch ich nicht mehr bei 11er Kombinationen suchen). Man könnte auch sinnvoll Kombinationen durchzählen...

    Könnte man noch ewig diskutieren, aber das ist alles egal. Da dem OP Grundkenntnisse fehlen. Wie benutzt man eine Variable, wie eine Funktion, wie den Indexoperator etc. und ohne das einigermassen drauf zu haben wird keine lesbare Lösung rauskommen.



  • @codinglea also ich habe jetzt auch mal selbst den debugger verwendet.
    fehler nummer 1: in der k-schleife wird m mit max_k verglichen, das ist natürlich falsch.
    fehler nummer 2: du multiplizierst die anzahl der geldwerte mit den geldwerten und bei 5 ct werden dann 5 stck 5ct-münzen angezeigt, was natürlich quatsch ist. also richtigerweise müsstest du dann a, b, c, ... ausgeben und nicht a * a_wert, b * b_wert, c * c_wert, ... 😀