recursivamente implementando 'número mínimo de moedas' em python

Esse problema é o mesmo que solicitadoAqui.

Dada uma lista de moedas, seus valores (c1, c2, c3, ... cj, ...) e a soma total i. Encontre o número mínimo de moedas cuja soma é i (podemos usar quantas moedas de um tipo quisermos), ou informe que não é possível selecionar moedas de forma que elas soem para S.

Acabei de introduzir a programação dinâmica ontem e tentei criar um código para ela.

# Optimal substructure: C[i] = 1 + min_j(C[i-cj])
cdict = {}
def C(i, coins):

    if i <= 0:
        return 0

    if i in cdict:
        return cdict[i]
    else:
        answer = 1 + min([C(i - cj, coins) for cj in coins])
        cdict[i] = answer
        return answer

Aqui, C [i] é a solução ideal para a quantidade de dinheiro 'i'. E as moedas disponíveis são {c1, c2, ..., cj, ...} para o programa. Eu aumentei o limite de recursão para evitar que a profundidade máxima de recursão excedesse o erro. Mas, este programa dá a resposta certa apenas a alguém e quando uma solução não é possível, isso não indica isso.

O que há de errado com meu código e como corrigi-lo?

questionAnswers(5)

yourAnswerToTheQuestion