Алгоритм работы банкомата

Программный продукт имитирует работу банкомата. В наличии есть 10 купюр по 100 грн, 5 по 50 грн и 15 по 20 грн. Пользователь вводит целое число X — сумму которую желает снять. Программа должна вывести количество каждого вида купюр, которые должен выдать банкомат, если это возможно. Я уже создал форму и подписался на событие KeyPress текстбокса (чтобы разрешить вводить только цифры). Меня интересует именно тот вопрос как мне сделать, чтобы программа выводила количество купюр каждого вида которые должен выдать банкомат по условиям моей задачи.


Ответы (1 шт):

Автор решения: Андрей NOP

Начните, например, с такого алгоритма:

var banknotes = new Dictionary<int, int>
{
    [100] = 10,
    [50] = 5,
    [20] = 15
};
Console.Write("Введите сумму: ");
var amount = int.Parse(Console.ReadLine());
var toIssue = new Dictionary<int, int>();
var left = amount;
foreach (var nominal in banknotes.Keys.OrderByDescending(x => x))
{
    var count = Math.Min(left / nominal, banknotes[nominal]);
    toIssue[nominal] = count;
    left -= count * nominal;
}
if (left > 0)
{
    Console.WriteLine("Невозможно выдать введенную сумму!");
}
else
{
    Console.WriteLine("Выдаем:");
    foreach (var nominal in toIssue.Keys.OrderByDescending(x => x))
    {
        Console.WriteLine($"Купюр номиналом {nominal} — {toIssue[nominal]} штук");
        banknotes[nominal] -= toIssue[nominal];
    }
}

Этот код будет работать неправильно в некоторых ситуациях, например, если введено 1500 (можно выдать как 10*100+4*50+15*20, но программа скажет что нельзя), или 110 (еще более сложный случай, можно выдать как 50+3*20), доработайте алгоритм самостоятельно

→ Ссылка