Coin Change
Você tem uma quantidade ilimitada de moedas de alguns valores diferentes e quer pagar um valor exato usando o menor número possível de moedas.
Pegar a maior moeda que ainda cabe parece uma boa ideia, mas pode falhar. Com as moedas [1, 3, 4] e um valor de 6, pegar primeiro a maior moeda resulta em 4 + 1 + 1, três moedas, enquanto 3 + 3 precisa de apenas duas.
Uma maneira mais segura é construir a resposta a partir de valores pequenos. Seja fewest[t] o menor número de moedas que somam t. Para pagar 0, não são necessárias moedas. Para qualquer outro t, a última moeda usada tem algum valor c, e o que resta antes de usá-la é t - c, então
fewest[t] = 1 + the smallest fewest[t - c] entre todas as moedas c que não sejam maiores que t.
Para [1, 3, 4]: fewest[3] = 1, e fewest[6] = 1 + fewest[3] = 2. Se nenhuma moeda levar a um valor que possa ser pago, não será possível pagar t.
Escreva uma função chamada coinChange que recebe coins, uma lista de valores distintos de moedas, e um inteiro amount, e retorna o menor número de moedas que soma exatamente amount. Cada valor de moeda pode ser usado quantas vezes você quiser. Retorne -1 se não for possível obter o valor, e 0 quando amount for 0.
Por exemplo, coins = [2, 5, 10] e amount = 27 retornam 4 (10 + 10 + 5 + 2), e coins = [4, 6] com amount = 7 retorna -1.
Restrições: 1 <= coins.length <= 12, 1 <= coins[i] <= 10^4, todos os valores são distintos, 0 <= amount <= 10^4.
Função
- arg1integer-array
- arg2integer
- Retornainteger
Exemplos
- Entrada
- arg1 = [2, 5, 10]arg2 = 27
- Saída
- 4
- Entrada
- arg1 = [4, 6]arg2 = 7
- Saída
- -1
- Entrada
- arg1 = [3, 7]arg2 = 0
- Saída
- 0
+12 testes ocultos ao enviar
Dicas
Abra uma de cada vez. Cada uma revela um pouco mais.
Escolher sempre a maior moeda que cabe nem sempre resulta na menor quantidade de moedas. Experimente com as moedas
[1, 3, 4]e o valor6.Suponha que você já soubesse o menor número de moedas para cada valor menor que
t. A partir de quais valores menores é possível chegar atcom mais uma moeda?Preencha uma tabela
fewest[0..amount]começando em0e avançando:fewest[0] = 0, e cadafewest[t]é um a mais do que o melhorfewest[t - c]entre as moedasc <= t. Marque os valores que ninguém consegue alcançar com um valor maior do que qualquer resposta real, comoamount + 1, e transforme-o em-1no final.
Em breve, uma explicação completa deste problema.
Problemas parecidos
Problemas que usam as mesmas ideias. Resolver dois ou três é o que fixa um padrão.
Python
def coinChange(coins, amount):
# Escreva o código aquiCaso 1
Caso 2
Caso 3
Entrada
arg1 = [2, 5, 10] arg2 = 27
Esperado
4