Ao desenvolver minha resposta, notei que tinha alguns valores que não davam certo usando o método convencional de usar sempre a maior nota, mas que não eram impossíveis, se fossem usadas notas menores.
def sacar(saque_original: int):
def verificador_saque(saque: int, valor: int):
saque -= valor
if saque % 2 == 0 or saque % 5 == 0:
return True
return False
escolha = None
saque_atual = saque_original
cedulas_100 = 0
cedulas_50 = 0
cedulas_20 = 0
cedulas_10 = 0
cedulas_5 = 0
cedulas_2 = 0
while saque_atual > 1:
if saque_atual >= 100:
if verificador_saque(saque_atual, 100):
cedulas_100 += 1
saque_atual -= 100
continue
if saque_atual >= 50:
if verificador_saque(saque_atual, 50):
cedulas_50 += 1
saque_atual -= 50
continue
if saque_atual >= 20:
if verificador_saque(saque_atual, 20):
cedulas_20 += 1
saque_atual -= 20
continue
if saque_atual >= 10:
if verificador_saque(saque_atual, 10):
cedulas_10 += 1
saque_atual -= 10
continue
if saque_atual >= 5:
if verificador_saque(saque_atual, 5):
cedulas_5 += 1
saque_atual -=5
continue
if saque_atual >= 2:
if verificador_saque(saque_atual, 2):
cedulas_2 += 1
saque_atual -= 2
continue
if saque_atual != 0 and saque_atual % 2 != 0:
print('Não foi possível sacar esse valor.')
while True:
escolha = input(f'Gostaria de sacar {saque_original-1}? (y/n): ').lower()
if escolha == 'y' or escolha == 'n':
saque_original -= 1
saque_atual = saque_original
sacar(saque_original)
break
if escolha == None:
if cedulas_100 > 0:
print(f'{cedulas_100} de R$ 100')
if cedulas_50 > 0:
print(f'{cedulas_50} de R$ 50')
if cedulas_20 > 0:
print(f'{cedulas_20} de R$ 20')
if cedulas_10 > 0:
print(f'{cedulas_10} de R$ 10')
if cedulas_5 > 0:
print(f'{cedulas_5} de R$ 5')
if cedulas_2 > 0:
print(f'{cedulas_2} de R$ 2')
return True
while True:
try:
valor_saque = int(input('Digite o valor do saque (ou "0" para sair): '))
if valor_saque == 0:
print('Encerrado.')
break
if sacar(valor_saque) == True:
break
except:
print('Digite um valor numérico válido para saque')