Wechselgeld 5 besten Kombinationen



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



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