Eu preciso ir ao banco e sacar algum dinheiro. Preciso retirar US $ 30, US $ 22 para pagar à minha colega de quarto pela internet e US $ 8 pela lavanderia. Como nenhum deles pode fazer alterações, preciso que meus US $ 30 sejam divididos em duas partições dos dois tamanhos. Isso significa que, quando o caixa me perguntar como quero meus US $ 30, terei que fazer uma solicitação. Eu poderia dizer a eles que eu quero isso em vinte, cinco e cinco. Mas quero tornar minha solicitação o mais simples possível, para evitar ter que me repetir. Para simplificar minha solicitação, eu poderia pedir que meu dinheiro contenha vinte e pelo menos 2, porque o 8 está implícito no total, mas, melhor ainda, eu poderia simplesmente solicitar que uma das contas recebidas seja uma nota de um dólar (se você não está convencido disso, tente ganhar 29 dólares sem fazer 8).
Então está tudo bem e elegante, mas preciso fazer esse cálculo toda vez que vou ao banco, então pensei em escrever um programa para fazer isso (você escreveu um programa para fazer isso por mim).
Seu programa ou função deve ter uma lista de números inteiros que representam todos os pagamentos que preciso fazer e um conjunto de números inteiros que representam as denominações de notas disponíveis no banco, e você deve exibir a menor lista de denominações, de modo que todas as maneiras de fazer o total isso inclui que a lista de denominações pode ser claramente dividida na lista de pagamentos.
Regras extras
Você pode supor que a lista de denominação sempre contenha um
1
ou você pode adicioná-la a cada lista.Algumas entradas terão várias soluções mínimas. Nesses casos, você pode gerar um dos dois.
Isso é código-golfe, então as respostas serão pontuadas em bytes, com menos bytes sendo melhores.
Casos de teste
Payments, denominations -> requests
{22,8} {1,2,5,10,20,50} -> {1} or {2}
{2,1,2} {1,5} -> {1}
{20,10} {1,2,5,10,20,50} -> {}
{1,1,1,1} {1,2} -> {1,1,1}
{20,6} {1,4,5} -> {1}
{2,6} {1,2,7} -> {2}
{22, 11} {1, 3, 30, 50} -> {1, 3}
{44, 22} {1, 3, 30, 50} -> {1, 3, 3, 30}
{2,6} {1,2,7} -> {2}
.
(If you are not convinced of this just try to make 29 dollars without making 9)
Você quer dizer sem fazer 8? Ou Eu entendi mal