fundo
A moeda oficial da nação imaginária do Golfenistão é o foo , e existem apenas três tipos de moedas em circulação: 3 foos, 7 foos e 8 foos. Pode-se ver que não é possível pagar certas quantias, como 4 foos, usando essas moedas. No entanto, todas as quantidades grandes o suficiente podem ser formadas. Seu trabalho é encontrar a maior quantidade que não pode ser formada com as moedas (neste caso, 5 foos), conhecida como problema das moedas .
Entrada
Sua entrada é uma lista de números inteiros positivos, representando os valores das moedas em circulação. Duas coisas são garantidas:L = [n1, n2, ..., nk]
- O MDC dos elementos de
L
é 1. L
não contém o número 1.
Pode ser não classificado e / ou conter duplicatas (pense em moedas de edição especial).
Resultado
Como o GCD de L
é 1, todo número inteiro grande o suficiente m
pode ser expresso como uma combinação linear não negativa de seus elementos; em outras palavras, temos
m = a1*n1 + a2*n2 + ... + ak*nk
para alguns números inteiros . Sua saída é o maior número inteiro que não pode ser expresso neste formulário. Como sugestão, sabe-se que a saída é sempre menor que , se e são os elementos máximo e mínimo de ( referência ).ai ≥ 0
(n1 - 1)*(nk - 1)
n1
nk
L
Regras
Você pode escrever um programa completo ou uma função. A menor contagem de bytes vence e as brechas padrão não são permitidas. Se seu idioma possui uma operação interna para isso, você não pode usá-lo. Não há requisitos para eficiência de tempo ou memória, exceto que você deve poder avaliar os casos de teste antes de postar sua resposta.
Depois de postar esse desafio, o usuário @vihan apontou que o Stack Overflow tem uma duplicata exata . Com base nessa discussão meta , esse desafio não será excluído como duplicado; no entanto, peço que todas as respostas baseadas na versão SO citem os originais, recebam o status do Wiki da Comunidade e sejam excluídas se o autor original desejar postar sua resposta aqui.
Casos de teste
[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)
como o limite superior, onde p
e q
são o menor e o maior elemento do conjunto.
[2,3]
em uma quantidade razoável de tempo e nada mais. [2,5]
criaria cerca de um milhão de listas Python na memória.
FrobeniusNumber
no Mathematica.