Le problème de changement de pièces est très bien documenté. Compte tenu d' une offre infinie de pièces de dénominations x_1pour x_mvous devez trouver le nombre de combinaisons qui ajoutent jusqu'à y. Par exemple, étant donné x = {1,2,3}et y = 4nous avons quatre combinaisons:
{1,1,1,1}{1,1,2}{1,3}{2,2}
introduction
Il existe plusieurs variantes du problème de changement de pièce. Dans cette variante, nous avons deux restrictions supplémentaires:
- Chaque dénomination doit être utilisée au moins une fois.
- Exactement, un nombre fixe de pièces doit être utilisé au total.
Par exemple, étant donné x = {1,2,3}, y = 36et n = 15où nest le nombre total de pièces qui doivent être utilisées, nous obtenons quatre combinaisons:
{1,2,2,2,2,2,2,2,3,3,3,3,3,3,3}(1 un, 7 deux, 7 trois){1,1,2,2,2,2,2,3,3,3,3,3,3,3,3}(2 un, 5 deux, 8 trois){1,1,1,2,2,2,3,3,3,3,3,3,3,3,3}(3 un, 3 deux, 9 trois){1,1,1,1,2,3,3,3,3,3,3,3,3,3,3}(4 unités, 1 paire, 10 trois)
Défi
Le défi est d'écrire une fonction enumeratedans la langue de votre choix qui énumère toutes les combinaisons décrites ci-dessus étant donné:
- La liste des dénominations. Par exemple
{1,5,10,25}. Vous pouvez utiliser des listes ou des tableaux. - Un entier non négatif
yqui représente la somme de chaque combinaison. - Un entier non négatif
nqui indique le nombre total de pièces.
L'ordre des arguments n'a pas d'importance. Les fonctions sans point sont autorisées.
La sortie de la enumeratefonction doit être une liste de combinaisons. Chaque combinaison doit être unique et ce doit être une liste d' nentiers qui s'additionnent y. Chaque dénomination doit apparaître au moins une fois dans chaque combinaison et aucune combinaison ne doit manquer. L'ordre des entiers et des combinaisons n'a pas d'importance. Vous pouvez utiliser des listes ou des tableaux pour la sortie.
Gardez à l'esprit les cas de bord suivants:
- Si les deux
yetnsont nuls et que la liste des dénominations est vide, la sortie est une liste d'une combinaison, la combinaison vide (c'est-à-dire{{}}). - Sinon, si
yest zéro,nest nul ou la liste des dénominations est vide alors la sortie est une liste de combinaisons nulles (ie{}). - Plus généralement, si
yest inférieur à la somme des dénominations ounest inférieur au nombre de dénominations, alors la sortie est une liste de combinaisons nulles.
La notation sera basée sur la taille de l'ensemble du programme en octets. Notez que cela inclut la enumeratefonction, les fonctions d'assistance, les instructions d'importation, etc. Cela n'inclut pas les cas de test.
yest inférieur à la somme des dénominations, à un moment donné de votre solution récursive, vous atteindrez le cas de base où la liste des dénominations est vide. Par conséquent, la réponse sera {}(c.-à-d. Aucune solution trouvée). Si nest inférieur au nombre de dénominations, vous finirez par atteindre le cas de base où n = 0mais y != 0. Par conséquent, la réponse sera à nouveau {}.