Faz um tempinho que postaram a dúvida, mas fica pra posteridade kkkk, tenho um exemplo em c# pra sacar esses valores, se adicionar uma nota de 3, a regra de pegar o menor número de notas possível passa a não funcionar muito bem, mas é ajustável =/
using System;
using System.Collections.Generic;
class MainClass {
public static void Main (string[] args) {
while (true) {
Console.WriteLine("Insira a quantia desejada:");
var amount = int.Parse(Console.ReadLine());
var notes = new int[7] { 200, 100, 50, 20, 10, 5, 2 };
var wallet = new Dictionary<int, int> {
{ 200, 0 },
{ 100, 0 },
{ 50, 0 },
{ 20, 0 },
{ 10, 0 },
{ 5, 0 },
{ 2, 0 }
};
foreach (var note in notes) {
if (note > amount) {
continue;
}
var diff = amount - note;
var rest = amount % note;
var restIsOneOrTree = rest == 1 || rest == 3;
var amountIsEven = amount % 2 == 0;
var noteIsEven = note % 2 == 0;
if (!amountIsEven && noteIsEven) {
if (restIsOneOrTree && diff < 10) {
continue;
}
}
if (amountIsEven && !noteIsEven) {
continue;
}
if (restIsOneOrTree) {
amount -= note;
wallet[note]++;
continue;
}
int numberOfNotes = amount / note;
amount -= numberOfNotes * note;
wallet[note] += numberOfNotes;
}
foreach(var entry in wallet) {
if (entry.Value > 0) {
Console.WriteLine($"{entry.Value} notes of {entry.Key}");
}
}
}
}
}