Münzwechsler



  • Hi,

    ich habe folgendes Problem. Ich soll ein Programm schreiben, was für einen gegebene Betrag (Bsp.: n=5)
    alle Möglichkeiten des Münzwechsels ausgibt. Also zum Beispiel 5*1 und 2*2+1 (in diesem Fall gibt es 2 Münzsorten). Ich denke diese Aufgabe ist rekursiv zu lösen, komme jedoch nicht weiter. Hat jemand von euch so etwas vielleicht schon mal gemacht und kann mir helfen????



  • naja.. z.B. so (rohentwurf):

    void getCoins(int* muenzen,int* usedMuenzen, int length, int value, int start ) 
    {
    	int* usedMuenzenLocal = new int[length];
    	//kopiere die benutzen münzen..
    	for(int i = 0; i < length; ++i)
    		usedMuenzenLocal[i] = usedMuenzen[i];
    
        for(int i = start; i < length;) 
    	{		
    		if(value >= muenzen[i])
    		{
    			//man könnte hier aber auch muenze[i+1] stattdessen nehmen...
    			//die möglichkeit wollen wir natürlich nicht unterschlagen -->
    			getCoins(muenzen,usedMuenzenLocal, length, value,i+1);
    
    			//jetzt jedenfalls eine muenze nehmen
    			++usedMuenzenLocal[i];
    			//muenzwert noch vom übrigen wert abziehn
    			value -= muenzen[i];
    		}
    		else
    		{
    			//mit der muenze kann man nix mehr anfangen...
    			++i;
    		}
    	}
    	if(value == 0)
    	{
    		cout << "Moegliche Muenzausgabe: ";
    		for(int i = 0; i < length; ++i)
    		{
    			cout << usedMuenzenLocal[i] << "x " << muenzen[i] << " ";
    		}
    		cout << endl;
    	}
    	delete[] usedMuenzenLocal;
    }
    
    int main() 
    { 
    	int muenzen[] = {200,100,50,20,10,5,2,1}; //oder so ;)
    	int length = sizeof(muenzen)/sizeof(int);
    	int* usedMuenzen = new int[length];
    	for(int i = 0; i < length; ++i) 
    	{
    		usedMuenzen[i] = 0;
    	}
        //value ist der wert, der in muenzen ausgegeben werden soll.. (in cent)
    	int value = 30;
    	getCoins(muenzen,usedMuenzen,length,value,0);
    	delete[] usedMuenzen;
    
    }
    

    das geht aber bestimmt noch effektiver 😉



  • Fertige Lösungen sind Scheiße.


Anmelden zum Antworten