Фон
Официальная валюта мнимой нации Golfenistan является Foo , и есть только три вида монет в обращении: 3 Foos, 7 и 8 Foos Foos. Можно видеть, что с помощью этих монет невозможно заплатить определенную сумму, например 4 фо. Тем не менее, все достаточно большие суммы могут быть сформированы. Ваша задача - найти наибольшую сумму, которая не может быть сформирована монетами (в данном случае 5 фу), которая известна как проблема с монетами .
вход
Ваш ввод представляет собой список натуральных чисел, представляющих ценности монет в обращении. Об этом гарантированы две вещи:L = [n1, n2, ..., nk]
- GCD элементов
L
- 1. L
не содержит номер 1.
Он может быть несортированным и / или содержать дубликаты (например, монеты специального издания).
Выход
Поскольку GCD L
равен 1, каждое достаточно большое целое число m
может быть выражено как неотрицательная линейная комбинация его элементов; другими словами, мы имеем
m = a1*n1 + a2*n2 + ... + ak*nk
для некоторых целых чисел . Ваш вывод является наибольшим целым числом, которое не может быть выражено в этой форме. Как подсказка, известно, что выходные данные всегда меньше, чем , если и являются максимальными и минимальными элементами ( ссылка ).ai ≥ 0
(n1 - 1)*(nk - 1)
n1
nk
L
правила
Вы можете написать полную программу или функцию. Побеждает меньшее количество байтов, и стандартные лазейки запрещены. Если ваш язык имеет встроенную операцию для этого, вы не можете использовать его. Нет никаких требований к времени или эффективности использования памяти, за исключением того, что вы должны быть в состоянии оценить тестовые примеры перед публикацией вашего ответа.
После того, как я опубликовал эту проблему, пользователь @vihan указал, что переполнение стека имеет точную копию . Основываясь на этой мета-дискуссии , эта задача не будет удалена как дубликат; тем не менее, я прошу, чтобы все ответы, основанные на ответах версии SO, содержали ссылки на оригиналы, имели статус Wiki сообщества и удалялись, если автор оригинала хочет опубликовать свой ответ здесь.
Тестовые случаи
[3, 7, 8] -> 5
[25, 10, 16] -> 79
[11, 12, 13, 14, 13, 14] -> 43
[101, 10] -> 899
[101, 10, 899] -> 889
[101, 10, 11] -> 89
[30, 105, 70, 42] -> 383
[2, 51, 6] -> 49
(p - 1)(q - 1)
верхнюю границу, где p
и q
являются наименьшим и наибольшим элементом множества.
[2,3]
за разумное количество времени и ничего больше. [2,5]
создаст около миллиона списков Python в памяти.
FrobeniusNumber
в Mathematica.