Проблема смены монет очень хорошо задокументирована. Учитывая бесконечный запас монет номиналов 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
которое обозначает общее количество монет.
Порядок аргументов не имеет значения. Точечные функции разрешены.
Выходные данные enumerate
функции должны быть списком комбинаций. Каждая комбинация должна быть уникальной, и это должен быть список n
целых чисел, которые складываются в y
. Каждое наименование должно появляться хотя бы один раз в каждой комбинации, и ни одна комбинация не должна отсутствовать. Порядок целых чисел и комбинаций не имеет значения. Вы можете использовать списки или массивы для вывода.
Имейте в виду следующие крайние случаи:
- Если оба
y
иn
равны нулю и список наименований пуст, то на выходе получается список из одной комбинации, пустой комбинации (то есть{{}}
). - В противном случае, если
y
ноль,n
ноль или список наименований пуст, то на выходе получается список нулевых комбинаций (т.е.{}
). - В более общем смысле, если
y
меньше, чем сумма достоинств илиn
меньше, чем число достоинств, то результатом является список нулевых комбинаций.
Оценка будет зависеть от размера всей программы в байтах. Обратите внимание, что это включает в себя enumerate
функцию, вспомогательные функции, операторы импорта и т. Д. Оно не включает тестовые случаи.
источник
y
меньше суммы деноминаций, то в какой-то момент вашего рекурсивного решения вы достигнете базового случая, когда список конфессий пуст. Следовательно, ответ будет{}
(т.е. решение не найдено). Еслиn
число конфессий меньше, то в конечном итоге вы достигнете базового варианта, где,n = 0
ноy != 0
. Следовательно, ответ снова будет{}
.Ответы:
05AB1E, 20 байтов
Ввод в следующем порядке:
list of values
,nr of coins
,sum to reach
.Объяснение вкратце
final length - length of unique coin list
Попробуйте онлайн
Онлайн-компилятор не может обрабатывать большое количество монет.
источник
MATL , 22 байта
Порядок ввода: массив номиналов, количество монет (
n
), желаемая сумма (y
).Каждая комбинация отображается в отдельной строке. Пустой вывод отображается в виде пустой строки (поэтому ничего).
Попробуйте онлайн!
Коду не хватает памяти в онлайн-компиляторе для примера в задаче, но работает автономно со стандартным, достаточно современным компьютером:
объяснение
источник
Python 3,
120106 байтАнонимная функция, которая принимает входной
(x_1, x_2, x_3 ... , x_k)
аргумент из набора деноминаций в форме , целевого значения и количества монет и возвращает список кортежей в форме[(solution_1), (solution_2), (solution_3), ... (solution_k)]
.Как это устроено
Itertools
«Scombinations_with_replacement
функция используется для генерации всехl-len(d)
комбинаций, с заменой, из номиналов. Прибавляяd
к каждой из этих комбинаций, гарантируется, что каждая купюра появляется хотя бы один раз, и что новая комбинация имеет длинуl
. Если элементы комбинации суммируются сt
, комбинация добавляется в список возврата как кортеж.Попробуйте это на Ideone
Альтернативный метод для 108 байтов
Анонимная функция, которая принимает входной
(x_1, x_2, x_3 ... , x_k)
аргумент из набора деноминаций формы , целевого значения и количества монет и возвращает набор кортежей формы{(solution_1), (solution_2), (solution_3), ... (solution_k)}
.Как это работает (другая версия)
При этом используется
product
функцияitertools
для создания всехl-len(d)
договоренностей деноминаций. Прибавляяd
к каждой из этих комбинаций, гарантируется, что каждая купюра появляется хотя бы один раз, и что новая комбинация имеет длинуl
. Если элементы комбинации суммируются сt
, комбинация сортируется, преобразуется из списка в кортеж и добавляется в возвращаемые кортежи. Наконец, вызовset
удаляет любые дубликаты.Попробуйте это на Ideone (другая версия)
источник
JavaScript (ES6), 135 байт
источник