Schwierigkeiten bei Münzproblem mit Backtracking



  • Hi Leute.

    Es geht um folgende Aufgabe:
    Es sollen alle Möglichkeiten gefunden und ausgegeben werden einen bestimmten Geldbetrag durch die Kombination gültiger Münzen darzustellen.

    Ich bin schon eine ganze Weile an dieser Aufgabe, bin mit meinem Latein aber nun aber am Ende.

    Das ganze habe ich mit einer Klasse umgesetzt in der dann eine Funktion für die Zerlegung zuständig ist.
    Als Ergebnis bekomme ich mit den unten angegebenen Werten zwei Kombinationen:

    0.1 0.2 0.1 0.1
    0.1 0.2 0.2
    Kombinationen: 2
    

    Wieso wird mir die Kombination mit 5 x 0.10 nicht angezeigt?
    Was mache ich dabei falsch?

    Über einen kleinen Denkanstoß wäre ich dankbar.

    Betrag  = 0.50
    	AnzKombis = 0
    	AnzMuenzen = 2
    	muenzTypen[1] =  0.10
    	muenzTypen[2] =  0.20
    
    void zerlegung(int ebene,double betrag)
          { 
             //Ausgabe der ermittelten Folge
             if(betrag == 0.00)
             {
                for(int i = 1;i < ebene; i++)
                    cout<<folge[i]<<" ";
    
                cout<<endl;
    
                AnzKombis += 1;
             }
    
            //Prüfen welche Muenze in Betrag passt
            for(int i=1;i <= AnzMuenzen;i++)
            {
               if(betrag - muenzTypen[i] >= 0.00)
               {
                  folge[ebene] = muenzTypen[i];
    
                  //rekursiver Aufruf der Funktion
                  zerlegung(ebene + 1,betrag - muenzTypen[i]);
               }
            }
          }
    


  • Tipp: Rechne nicht mit Double. Zu ungenau.

    Genauer: Rechne in Cent, also mit int. 0.5 - 0.1 - 0.1 -0.1 -0.1 -0.1 ist nun einmal nicht 0.0. So traurig das auch ist.

    Ansonsten: Arrays beginnen bei 0, nicht bei 1. Solltest du entsprechend ändern, ist eine schlechte Angewohnheit die man schnell los werden sollte.



  • Fellhuhn 😃 ... Dank' dir!!!

    Läuft jetzt alles einwandfrei.


Anmelden zum Antworten