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_1
pour x_m
vous devez trouver le nombre de combinaisons qui ajoutent jusqu'à y
. Par exemple, étant donné x = {1,2,3}
et y = 4
nous 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 = 36
et n = 15
où n
est 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 enumerate
dans 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
y
qui représente la somme de chaque combinaison. - Un entier non négatif
n
qui 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 enumerate
fonction doit être une liste de combinaisons. Chaque combinaison doit être unique et ce doit être une liste d' n
entiers 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
y
etn
sont 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
y
est zéro,n
est nul ou la liste des dénominations est vide alors la sortie est une liste de combinaisons nulles (ie{}
). - Plus généralement, si
y
est inférieur à la somme des dénominations oun
est 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 enumerate
fonction, les fonctions d'assistance, les instructions d'importation, etc. Cela n'inclut pas les cas de test.
y
est 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 n
est inférieur au nombre de dénominations, vous finirez par atteindre le cas de base où n = 0
mais y != 0
. Par conséquent, la réponse sera à nouveau {}
.