Wechselgeld 5 besten Kombinationen



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


  • Mod

    @Wade1234 sagte in Wechselgeld 5 besten Kombinationen:

    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.

    VLAs funktionieren so nicht. Die verhalten sich wie automatische Variablen, und technisch gesehen liegen sie bei üblichen Implementierungen auf dem Stack.

    Und bezüglich deiner davor gewagten Vermutung, dass es sie in C nicht geben würde: VLAs gibt es nur in C, genauer ab C99. Wobei sie ab C11 nur noch optional sind. In C++ gibt es sie nicht. Bloß der GCC bietet sie als optionale Spracherweiterung für C++ an, da er dafür einfach seine Implementierung von C99 1:1 übernehmen kann.

    wob könnte seinen Code relativ einfach ohne VLAs auskommen lassen, indem er das sizeof-Resultat nicht zwischenspeichert, da das Ergebnis von sizeof eine Compilezeitkonstante ist. Da es aber praktisch keinen Unterschied macht, und das Vorkommen von VLAs in diesem Code nur aufgrund von Haarspalterei über unintuitive Eigenschaften der Sprache C kommt (const ist hier keine Compilerzeitkonstante....), finde ich das voll in Ordnung, das hier zugunsten der Lesbarkeit so zu machen. VLAs haben einen schlechten Ruf, aber der kommt von der anderen, falschen Anwendungsart her, die hier nicht benutzt wird.



  • @SeppJ sagte in Wechselgeld 5 besten Kombinationen:

    Und bezüglich deiner davor gewagten Vermutung, dass es sie in C nicht geben würde: VLAs gibt es nur in C, genauer ab C99. Wobei sie ab C11 nur noch optional sind. In C++ gibt es sie nicht. Bloß der GCC bietet sie als optionale Spracherweiterung für C++ an, da er dafür einfach seine Implementierung von C99 1:1 übernehmen kann.

    ich meinte damit, dass man unter c++ guten gewissens const int als längenangabe für ein array nehmen kann, unter c aber davon abstand nehmen sollte, sofern man keinen guten grund dafür hat.