Для удовольствия, я хотел бы, чтобы кто-то использовал и злоупотреблял LINQ для решения этой проблемы с деньгами. Я действительно понятия не имею, как вы это сделаете - я предполагаю, что вы заполняете какой-то набор, а затем выбираете его.
Если дано общее количество монет и общее количество всех монет добавлено вместе: Покажите все возможные комбинации монет. Монеты - кварталы (0,25), Dimes (.10) Никели (0,05) и Пенни (0,01)
Включите эту опцию, чтобы было нулевое число монеты или должно быть не менее 1 из них.
Проблема с образцом: если у меня есть 19 монет, и монеты составляют до $1,56, и там должно быть не менее 1 каждого типа монет.
Ответ будет следующим:
1 квартал, 9 копейки, 8 никелей, 1 пенни
2 квартала, 5 Dimes, 11 Nickels, 1 Pennies
2 квартала, 9 монет, 2 никеля, 6 пенни
3 квартала, 1 день, 14 никелей, 1 пенни
3 квартала, 5 Dimes, 5 Nickels, 6 Pennyies
4 квартала, 1 день, 8 никелей, 6 пенни
5 кварталов, 1 Dimes, 2 Nickels, 11 Pennyies
И если мы допустили нуль для coint, мы позволили получить дополнительный 0 кварталов, 13 Dimes, 5 Nickels, 1 Pennies
Вот пример кода С#, использующего метод грубой силы для решения проблемы. Не беспокойтесь о том, чтобы улучшить выборку, просто взгляните на решение, используя Linq. // По возможности старайтесь не использовать любой циклический код regualar С#.
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));
}