Solução escrita por Enzo Dantas
Conhecimento prévio necessário:
A solução desse problema se baseia em duas principais observações - as partes de implementação e conhecimento teórico prévio são pouquíssimo relevantes.
Observação 1: primeiramente, se o menor número é maior que 1, é impossível formar o número 1 e essa é a resposta. Se, depois de utilizar o número 1, o menor número que temos é o 3, é impossível formar o número 2 e essa é a resposta. Generalizando, se o menor número que não conseguimos formar é e o menor número ainda não utilizado é maior que
, então é impossível formar
e essa é a resposta.
Observação 2: se eu consigo formar todos os número até 4, por exemplo, e o menor número não utilizado é 3, então conseguimos formar todos os números até 4+3=7. É fácil ver que, se temos um número e é possível formar todos os números no intervalo
, então é possível adicionar
a essas somas e formar todos os números no intervalo
. Perceba que, ao percorrer o array em ordem crescente, o intervalo de somas alcançáveis é sempre contínuo, e no momento que ele fica descontínuo então achamos a resposta, como é visto na observação 1.
e
são inicialmente 0, e o
vai crescendo até achar a resposta enquanto o
fica fixo no 0.
A complexidade desse código é (
para ordenar o array e
para percorrê-lo).
Recomendamos que você tente implementar o problema antes de ver o código.Veja a implementação nesse link.