Ради удовольствия я хотел бы, чтобы кто-то использовал и злоупотреблял LINQ для решения этой проблемы с деньгами.
Я действительно понятия не имею, как бы вы это сделали - я полагаю, заполнив некоторый набор, а затем выбрав его.
Если задано общее количество монет и указать общее количество всех монет, сложенных вместе:
Показать все возможные комбинации монет. Монеты: четверть (.25), десять центов (.10), никель (.05) и пенни (.01)
Включите эту опцию, чтобы тип монеты мог быть нулевым или должен быть хотя бы один из них.
Пример задачи: если у меня есть 19 монет, и монеты складываются до 1,56 доллара, и должна быть как минимум 1 монета каждого типа.
Ответ будет:
1 квартал, 9 центов, 8 никелей, 1 пенни
2 четверти, 5 центов, 11 никелей, 1 копейка
2 четверти, 9 центов, 2 никеля, 6 копеек
3 квартала, 1 цент, 14 никелей, 1 пенни
3 четверти, 5 центов, 5 никелей, 6 копеек
4 четверти, 1 цент, 8 никелей, 6 копеек
5 кварталов, 1 цент, 2 никеля, 11 пенсов
И если мы допустим ноль для монеты, мы позволим получить дополнительную
0 кварталов, 13 центов, 5 никелей, 1 пенни
Вот пример кода C #, использующего метод грубой силы для решения проблемы.
Не беспокойтесь об улучшении примера, давайте просто посмотрим решение с использованием Linq.
// Старайтесь не использовать какой-либо обычный циклический код c #, если это возможно.
private void SolveCoinProblem(int totalNumberOfCoins, double totalAmount, int minimumNumberOfEachCoin)
{
int foundCount = 0;
long numberOfTries = 0;
Console.WriteLine(String.Format("Solving Coin Problem:TotalNumberOfCoins={0}TotalAmount={1}MinimumNumberOfEachCoin{2}", totalNumberOfCoins, totalAmount, minimumNumberOfEachCoin));
for (int totalQuarters = minimumNumberOfEachCoin; totalQuarters < totalNumberOfCoins; totalQuarters++)
{
for (int totalDimes = minimumNumberOfEachCoin; totalDimes < totalNumberOfCoins; totalDimes++)
{
for (int totalNickels = minimumNumberOfEachCoin; totalNickels < totalNumberOfCoins; totalNickels++)
{
for (int totalPennies = minimumNumberOfEachCoin; totalPennies < totalNumberOfCoins; totalPennies++)
{
numberOfTries++;
if (totalQuarters + totalDimes + totalNickels + totalPennies == totalNumberOfCoins)
{
if (Math.Round((totalQuarters * .25) + (totalDimes * .10) + (totalNickels * .05) + (totalPennies * .01),2) == totalAmount)
{
Console.WriteLine(String.Format("{0} Quarters, {1} Dimes, {2} Nickels, {3} Pennies", totalQuarters, totalDimes, totalNickels, totalPennies));
foundCount++;
}
}
}
}
}
}
Console.WriteLine(String.Format("{0} Combinations Found. We tried {1} combinations.", foundCount, numberOfTries));
}