Проблема зміни монети дуже добре зафіксована. З огляду на нескінченний запас монет номіналів x_1
в x_m
вам потрібно знайти число комбінацій , які додають до y
. Наприклад, дано x = {1,2,3}
і у y = 4
нас є чотири комбінації:
{1,1,1,1}
{1,1,2}
{1,3}
{2,2}
Вступ
Існує кілька варіантів проблеми зміни монети. У цьому варіанті у нас є два додаткові обмеження:
- Кожна конфесія повинна бути використана хоча б один раз.
- Всього потрібно використовувати фіксовану кількість монет.
Наприклад, з урахуванням x = {1,2,3}
, y = 36
а n = 15
де n
загальна кількість монет, які необхідно використовувати, ми отримуємо чотири комбінації:
{1,2,2,2,2,2,2,2,3,3,3,3,3,3,3}
(1, 7 двійки, 7 трійки){1,1,2,2,2,2,2,3,3,3,3,3,3,3,3}
(2, 5 двійки, 8 трійки){1,1,1,2,2,2,3,3,3,3,3,3,3,3,3}
(3, 3 двійки, 9 трійки){1,1,1,1,2,3,3,3,3,3,3,3,3,3,3}
(4, 1 двійка, 10 трійки)
Виклик
Завдання полягає в тому, щоб написати функцію enumerate
на обраній вами мові, яка перераховує всі комбінації, як описано вище:
- Список конфесій. Наприклад
{1,5,10,25}
. Ви можете використовувати або списки, або масиви. - Невід'ємне ціле число,
y
яке позначає суму кожної комбінації. - Невід’ємне ціле число,
n
яке позначає загальну кількість монет.
Порядок аргументів не має значення. Функції pointfree дозволені.
Виведенням enumerate
функції має бути список комбінацій. Кожна комбінація повинна бути унікальною, і вона має містити список n
цілих чисел, до яких додається y
. Кожна номінація повинна з’являтися принаймні один раз у кожній комбінації, і жодна комбінація не повинна бути відсутньою. Упорядкування цілих чисел та комбінацій не має значення. Ви можете використовувати або списки, або масиви для виводу.
Майте на увазі наступні крайові випадки:
- Якщо обоє
y
іn
дорівнюють нулю, а список номіналів порожній, то вихід - це список однієї комбінації, порожня комбінація (тобто{{}}
). - В іншому випадку, якщо
y
дорівнює нулю,n
дорівнює нулю або список номіналів порожній, то вихід - це список нульових комбінацій (тобто{}
). - Більш загально, якщо
y
менша сума номіналів абоn
менша за кількість номіналів, то вихід - це список нульових комбінацій.
Оцінка балів буде залежати від розміру всієї програми в байтах. Зауважте, що це включає в себе enumerate
функцію, допоміжні функції, заяви про імпорт тощо. Це не включає тестові випадки.
y
менша сума деномінацій, то в якийсь момент рекурсивного рішення ви досягнете базового випадку, коли список конфесій порожній. Отже, відповідь буде {}
(тобто рішення не знайдено). Якщо n
менше, ніж кількість конфесій, ви зрештою дістанетесь до базового випадку, де, n = 0
але y != 0
. Отже, відповідь знову буде {}
.