Wechselgeld 5 besten Kombinationen



  • @codinglea also

    • betragmuss einen wert zugewiesen bekommen
    • die breaks müssen wieder eingeführt werden, um unnötige berechnungen zu vermeiden, in der a-schleife befindet sich noch so eine überprüfung, die du an den anfang jeder schleife kopieren und dann um alle unnötigen berechnungen bereinigen kannst. also es geht darum, zu überprüfen, ob die summe aller bisherigen werte den betrag überschreitet und wenn dem so ist, braucht ja nicht weiter gerechnet zu werden. also wenn der betrag 15 sein soll, muss ja z.b. nicht überprüft werden, ob eine lösung mit 500er scheinen vorkommen könnte
    • die anzahl der gefundenen lösungen muss gezählt werden und wenn die gewünschte anzahl der lösungen erreicht ist, muss die funktion beendet werden. das kannst du entweder erreichen, indem du direkt mit return aus der funktion aussteigst, oder indem du mittels sprunganweisung (goto, mach es ruhig mal) hinter die äußerste schleife springst.
    • das getchar() muss raus

    und dann sollte das erstmal funktionieren und du kannst dich damit beschäftigen, das programm zu verbessern. 🙂



  • @EinNutzer0
    Was soll ich dir denn schreiben? 😅
    Und ich glaube, dass ich das noch gar nicht kann, weil ich zu neu bin.

    @hustbaer
    "nur sehr schlimm" klingt auch schon blöd...
    Wieso schickst du denn nicht mal ein Vorschlag, wie man es rekursiv macht?

    @Wade1234
    Alles klar, ich bastel dann noch mal ein bisschen.



  • Wüsste sonst jemand, wie ich eine Funktion dafür aufstelle?

    Mir ist klar, dass ich immer von der größtmöglichen Geldeinheit(z.B. bei 50€ der 50er Schein) -1 abziehen muss, sodass 2x20€ und 1x10€ usw entstehen. Das beste Ergebnis habe ich ja auch schon geschafft.

    Ich brauche keine rekursive Lösung. Es würde mir reichen, wenn ich wenigstens wüsste, wie die Funktion aufgebaut wäre. Die Rekursion würde ich mir dann selber zurecht basteln.
    mit dem Brute Force funktioniert es ja nur halbwegs...
    Da gibt es anscheinend auch 4€ und 3€ Münzen. 😅


  • Gesperrt

    Naja den jetzigen Code, ich hätte dann geholfen. Aber ich merke gerade, das ich auch keine PN schreiben kann. 😞 schade.



  • @EinNutzer0
    Ja, das ist echt schade...


  • Gesperrt

    @codinglea sagte in Wechselgeld 5 besten Kombinationen:

    @EinNutzer0
    Ja, das ist echt schade...

    Probier es jetzt einmal



  • @EinNutzer0
    Geht leider immer noch nicht...


  • Gesperrt

    @codinglea sagte in Wechselgeld 5 besten Kombinationen:

    @EinNutzer0
    Geht leider immer noch nicht...

    Es gibt da eine Option unter Einstellungen, ich glaube Chat Nachrichten erlauben.



  • 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.