Sobes.tech
Назад к вопросам
Senior
2

```python BILLS = (5000, 1000, 500, 100, 50) class SDK(ABC): @abstractmethod def count_banknotes(self, banknote: int) -> int: pass @abstractmethod def move_banknote_to_dispenser(self, banknote: int, count: int) -> None: pass @abstractmethod def open_dispenser(self) -> None: pass class ATM(): def __init__(self, atm_api: SDK): self.atm_api: SDK = atm_api def withdraw(self, amount: int) -> bool: bills_plan: dict[int: int] = {} for bill in BILLS: available = self.count_bills(bill) self.atm_api.open_dispenser() for bill, count in bills_plan.items(): self.atm_api.move_banknote_to_dispenser(bill, count) return True ``` Complete the implementation of the `withdraw` method in the `ATM` class to correctly dispense the requested amount using the available banknotes.

Компании, где спрашивали
Яндекс

Ответ от нейросети

sobes.tech AI

python BILLS = (5000, 1000, 500, 100, 50)

class SDK(ABC): @abstractmethod def count_banknotes(self, banknote: int) -> int: pass

@abstractmethod
def move_banknote_to_dispenser(self, banknote: int, count: int) -> None:
    pass

@abstractmethod
def open_dispenser(self) -> None:
    pass

class ATM(): def init(self, atm_api: SDK): self.atm_api: SDK = atm_api

def withdraw(self, amount: int) -> bool:
    bills_plan: dict[int, int] = {}
    remaining = amount

    for bill in BILLS:
        available = self.atm_api.count_banknotes(bill)
        needed = remaining // bill
        count = min(needed, available)
        if count > 0:
            bills_plan[bill] = count
            remaining -= bill * count

    if remaining != 0:
        # Невозможно выдать точную сумму
        return False

    self.atm_api.open_dispenser()
    for bill, count in bills_plan.items():
        self.atm_api.move_banknote_to_dispenser(bill, count)

    return True

Объяснение:
- Сначала пытаемся покрыть сумму максимально крупными банкнотами.
- Для каждой банкноты вычисляем, сколько нужно и сколько доступно.
- Формируем план выдачи (bills_plan).
- Если после распределения сумма не равна нулю — значит, точную сумму выдать нельзя.
- Если можно — открываем диспенсер и перемещаем банкноты согласно плану.