C – Supprimer les résultats en double dans la fonction récursive

Je dois créer une fonction récursive qui vous indique le nombre de façons dont un nombre de centimes peut être transformé en changement. (Utilisation des quartiers, des pièces de dix cents et des sous).

Jusqu’à présent, j’ai une fonction récursive qui le fait, mais elle compte la même combinaison plusieurs fois, donc le nombre est trop grand. Comment puis-je supprimer les combinaisons en double?

Code:

#include  //Prototypes int coins(int); int main(void){ //Declarations int num; //Get user input printf("Enter an amount of change in cents: "); scanf("%d", &num); //Change to fgets //Call function printf("There are %d ways to make change for %d cents.\n", (coins(num)), num); } int coins(int amt){ //Declarations int ways=0; //Base Case if(amt == 0){ return 1; } //int ways=0; More efficient after base case. if(amt >= 1){ ways+=coins(amt-1); } if(amt >= 5){ ways+=coins(amt-5); } if(amt >= 10){ ways+=coins(amt-10); } if(amt >= 25){ ways+=coins(amt-25); } return ways; } 

Exemple:

Entrée: 17 (cents)

Sortie: 80 voies ** La sortie devrait être 6

 #include  int coins(int, int); int main(void){ int num; printf("Enter an amount of change in cents: "); scanf("%d", &num); printf("There are %d ways to make change for %d cents.\n", coins(num, 0), num); return 0; } int coins(int amt, int kind){ static int kinds[4] = {25, 10, 5, 1}; int ways=0, i, n; if(kinds[kind] == 1)//always divisible return 1; n = amt / kinds[kind]; for(i = 0; i <= n; ++i) ways+=coins(amt-kinds[kind]*i, kind + 1); return ways; }