1
resposta

Resolvendo valores não possíveis no método "greedy"

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')

Garanta sua matrícula hoje e ganhe + 2 meses grátis

Continue sua jornada tech com ainda mais tempo para aprender e evoluir

Quero aproveitar agora
1 resposta

Oi, Pedro! Como vai?

Interessante como você percebeu as limitações do método greedy em determinados cenários. O seu código mostra um ótimo entendimento da lógica de verificação e da estrutura de repetição para ajustar o valor do saque. Esse cuidado com os casos “não possíveis” é um diferencial importante para lidar com exceções de forma inteligente.

Alura Conte com o apoio da comunidade Alura na sua jornada. Abraços e bons estudos!