Wechselgeld 5 besten Kombinationen



  • @Belli sagte in Wechselgeld 5 besten Kombinationen:

    @Wade1234 sagte in Wechselgeld 5 besten Kombinationen:

    @codinglea
    dann müsste es jetzt ja eigentlich laufen, sofern du keine beträge wie 10050 o.ä. eingibst, weil sich das programm da erst einmal aufhängt.
    ...
    achja und den code dann bitte! 🙂

    Du willst jetzt nicht allen Ernstes diesen Code mit den zig verschachtelten Schleifen weiter voran treiben, nachdem WOB hier eine kurze knackige allgemeine Lösung gepostet hat?

    um ehrlich zu sein: doch! und zwar einfach deshalb, weil sie sonst nichts lernt.



  • @Wade1234
    Danke!!!



  • Warum glaubst Du, kann sie aus dem Code von WOB nichts lernen?
    Da ist Rekursion drin - wo sie bekanntermaßen Schwierigkeiten hat - und vor allen Dingen kann man da wunderschön dran sehen, wie leicht man es sich und anderen machen kann, wenn man seine Variablen vernünftig benennt.



  • @codinglea sagte in Wechselgeld 5 besten Kombinationen:

    @Wade1234
    Danke!!!

    Sorry, aber warum zur Hölle willst du diesen unleserlichen Code, den die Wade einreden will, weiter anschauen und benutzen?! Sobald du nur eine Sache dort ändern willst, wie zum Beispiel einen neuen Geldschein einführen oder einen bisherigen löschen willst, musst du ungeheuer viel Code ändern.

    Hast du wenigstens mal versucht, meine gepostete Lösung zu verstehen? Ich sage jetzt nicht, dass sie das nonplusultra ist, aber du kannst dort wenigstens beliebig die verfügbaren Scheine angeben und bekommst dann, ohne weiteren Code ändern zu müssen, alle Lösungen.



  • @wob
    Ich habe es versucht...
    Aber ich verstehe ihn nicht komplett und will ihn nicht einfach übernehmen.



  • @codinglea sagte in Wechselgeld 5 besten Kombinationen:

    Aber ich verstehe ihn nicht komplett und will ihn nicht einfach übernehmen.

    Dann wäre doch die Frage, wo du in dem Code Probleme hast.



  • @Belli sagte in Wechselgeld 5 besten Kombinationen:

    Warum glaubst Du, kann sie aus dem Code von WOB nichts lernen?

    weil das noch zu viel ist und weil da z.b. keine kommentare und auch sonst keine erklärungen bei waren. einfach nur "hier haste den code, den kannst du dann mit copy & paste in dein projekt einfügen!" und sowas ist einfach schlecht.

    außerdem ist das hier falsch:

        const int scheine_size = sizeof(scheine)/sizeof(scheine[0]);
        int auswahl[scheine_size];
    

    unter c++ geht das soweit ich weiß, aber unter c macht man sowas nicht!

    Da ist Rekursion drin - wo sie bekanntermaßen Schwierigkeiten hat - und vor allen Dingen kann man da wunderschön dran sehen, wie leicht man es sich und anderen machen kann, wenn man seine Variablen vernünftig benennt.

    ich habe zuerst darauf hingearbeitet, dass da erst einmal ein grundverständnis für iterative lösungsfindung vorhanden ist und ein funktionierendes programm entsteht, und jetzt arbeite ich darauf hin, dass das programm etwas verständlicher und leichter lesbar wird.



  • @Wade1234 sagte in Wechselgeld 5 besten Kombinationen:

    außerdem ist das hier falsch: (...)
    unter c++ geht das soweit ich weiß, aber unter c macht man sowas nicht!

    Weil? Das 2. Array ist genauso lang wie das erste. Es ist ja nicht so, dass scheine_size eine Variable von außen wäre.

    Und unter C++ würde ich das gerade nicht so machen, sondern ein std::vector oder ein std::array nehmen.



  • @wob sagte in Wechselgeld 5 besten Kombinationen:

    @Wade1234 sagte in Wechselgeld 5 besten Kombinationen:

    außerdem ist das hier falsch: (...)
    unter c++ geht das soweit ich weiß, aber unter c macht man sowas nicht!

    Weil? Das 2. Array ist genauso lang wie das erste. Es ist ja nicht so, dass scheine_size eine Variable von außen wäre.

    Und unter C++ würde ich das gerade nicht so machen, sondern ein std::vector oder ein std::array nehmen.

    naja du erzeugst da ein dynamisches array ("variable length array") und dynamisch ist eben fast immer doof. also was ich meine ist eben, dass du damit unnötig overhead produzierst, weil der speicher eben zur laufzeit angefordert wird und nicht während des copiliervorgangs.



  • @Wade1234 Du laberst Unsinn! Auch iterativ kann man das Problem in paar Zeilen lösen und nicht mit deiner Schrott-15fach Verschachtelung. Reine Zeitverschwendung sich mit dem Ansatz zu beschäftigen, da kein normaler Mensch das als "Lösung" ansieht und man daraus auch keine Lösung ableiten kann.



  • @TGGC sagte in Wechselgeld 5 besten Kombinationen:

    @Wade1234 Du laberst Unsinn! Auch iterativ kann man das Problem in paar Zeilen lösen und nicht mit deiner Schrott-15fach Verschachtelung. Reine Zeitverschwendung sich mit dem Ansatz zu beschäftigen, da kein normaler Mensch das als "Lösung" ansieht und man daraus auch keine Lösung ableiten kann.

    ja vielleicht, aber DU hast jedenfalls in den mittlerweile 170 beiträgen außer dümmlichen pöbeleien überhaupt nichts beigetragen - so wie jetzt ja auch schon wieder.



  • @Wade1234
    Ich finde Deinen Einsatz und Deine Hilfsbereitschaft super, wertvoll für jeden Anfänger, wirklich!
    Leider bist Du selbst aber ein bisschen lernunwillig und beratungsresistent, das finde ich dann wieder nicht so gut ...



  • @Belli es sagt ja niemand, dass nicht auch noch eine rekursive lösung erarbeitet werden kann, aber zuerst einmal sollte dafür die iterative lösung funktionieren. unübersichtlichkeit und mangelende praxisrelevanz hin oder her!



  • OT:

    Es ist grandios sich diesen Thread durchzulesen...
    popcorn faktor sondergleichen



  • @Wade1234 sagte in Wechselgeld 5 besten Kombinationen:

    @TGGC sagte in Wechselgeld 5 besten Kombinationen:

    @Wade1234 Du laberst Unsinn! Auch iterativ kann man das Problem in paar Zeilen lösen und nicht mit deiner Schrott-15fach Verschachtelung. Reine Zeitverschwendung sich mit dem Ansatz zu beschäftigen, da kein normaler Mensch das als "Lösung" ansieht und man daraus auch keine Lösung ableiten kann.

    ja vielleicht, aber DU hast jedenfalls in den mittlerweile 170 beiträgen außer dümmlichen pöbeleien überhaupt nichts beigetragen - so wie jetzt ja auch schon wieder.

    Dann muss du die mal lesen und verstehen. Solange wir dabei sind deinen Schrottcode zu reparieren beteilige ich mich aber an der Zeitverschwendung nicht mehr. Das lässt sich ohne Scheiss in 2 Zeilen viel logischer programmieren und du laberst was von "deine Lösung wär anfängergeeignet.". Bist du echt so dumm, das du das nicht blickst? Du torpedierst hier aktiv, das man ne sinnvolle Lösung entwickelt.



  • Dieser Beitrag wurde gelöscht!

  • Gesperrt

    @SeppJ sagte in Wechselgeld 5 besten Kombinationen:

    Ignorier' einfach alles von EinNutzer0, der ist einfach nicht hilfreich.

    Hier ist meine ANSI-C Version, die die "besten" 10 ausgibt, ich denke sie könnte hilfreich sein:

    #include <stdio.h>
    
    #define nums 9
    #define max_nums 5
    
    const int numbers1[nums] = {1, 2, 5, 10, 20, 50, 100, 200, 500};
    
    void calc_all(int *n, int idx, int sum, int *numbers2)
    {
        size_t i;
        if (*n <= 0)
        {
            return;
        }
        if (idx >= nums)
        {
            if (sum == 0)
            {
                for (i = 0; i < nums; i++)
                {
                    if (numbers2[i])
                    {
                        printf("%dx%d ", numbers2[i], numbers1[i]);
                    }
                }
                printf("\n");
                (*n)--;
            }
            return;
        }
        for (i = 0; i <= max_nums; i++)
        {
            if (sum - (numbers1[idx] * i) >= 0)
            {
                numbers2[idx] = i;
                calc_all(n, idx + 1, sum - (numbers1[idx] * i), numbers2);
                numbers2[idx] = 0;
            }
        }
    }
    
    int main()
    {
        int n = 10;
        int numbers2[nums] = {0};
        calc_all(&n, 0, 55, numbers2);
        return 0;
    }
    
    1x5 1x50
    1x5 1x10 2x20
    1x5 3x10 1x20
    1x5 5x10
    3x5 2x20
    3x5 2x10 1x20
    3x5 4x10
    5x5 1x10 1x20
    5x5 3x10
    5x2 1x5 2x20
    


  • @EinNutzer0: Warum übergibst du n als Zeiger? Und warum ist max_nums 5?
    Auch deine Benennung numbers1 und numbers2 ist nicht so toll.


  • Gesperrt

    @Th69 sagte in Wechselgeld 5 besten Kombinationen:

    Warum übergibst du n als Zeiger?

    Weil ich nicht auf eine globale Variable ausweichen möchte...

    @Th69 sagte in Wechselgeld 5 besten Kombinationen:

    Und warum ist max_nums 5?

    Weil es (bei mir) maximal 5mal dieselbe Scheinart geben soll.

    @Th69 sagte in Wechselgeld 5 besten Kombinationen:

    deine Benennung numbers1 und numbers2 ist nicht so toll.

    Punkt für dich.



  • @EinNutzer0 sagte in Wechselgeld 5 besten Kombinationen:

    @SeppJ sagte in Wechselgeld 5 besten Kombinationen:

    Ignorier' einfach alles von EinNutzer0, der ist einfach nicht hilfreich.

    Hier ist meine ANSI-C Version, die die "besten" 10 ausgibt, ich denke sie könnte hilfreich sein:

    #include <stdio.h>
    
    #define nums 9
    #define max_nums 5
    
    const int numbers1[nums] = {1, 2, 5, 10, 20, 50, 100, 200, 500};
    
    void calc_all(int *n, int idx, int sum, int *numbers2)
    {
        size_t i;
        if (*n <= 0)
        {
            return;
        }
        if (idx >= nums)
        {
            if (sum == 0)
            {
                for (i = 0; i < nums; i++)
                {
                    if (numbers2[i])
                    {
                        printf("%dx%d ", numbers2[i], numbers1[i]);
                    }
                }
                printf("\n");
                (*n)--;
            }
            return;
        }
        for (i = 0; i <= max_nums; i++)
        {
            if (sum - (numbers1[idx] * i) >= 0)
            {
                numbers2[idx] = i;
                calc_all(n, idx + 1, sum - (numbers1[idx] * i), numbers2);
                numbers2[idx] = 0;
            }
        }
    }
    
    int main()
    {
        int n = 10;
        int numbers2[nums] = {0};
        calc_all(&n, 0, 55, numbers2);
        return 0;
    }
    
    1x5 1x50
    1x5 1x10 2x20
    1x5 3x10 1x20
    1x5 5x10
    3x5 2x20
    3x5 2x10 1x20
    3x5 4x10
    5x5 1x10 1x20
    5x5 3x10
    5x2 1x5 2x20
    

    Ja, ist aber leider mal wieder falsch. 4) hat 6 Scheine und 5) hat nur 5 Scheine. Also deine max 5 Flickschusterei ist auch keine Lösung.