gpt4 book ai didi

c# - 有人可以滥用 LINQ 来解决这个金钱难题吗?

转载 作者:可可西里 更新时间:2023-11-01 08:57:57 25 4
gpt4 key购买 nike

为了好玩,我希望看到有人使用和滥用 LINQ 来解决这个金钱问题。我真的不知道你会怎么做 - 我想填充一些集合然后从中选择。

如果给定硬币总数并给出加在一起的所有硬币的总数:显示所有可能的硬币组合。硬币有四分之一 (.25)、一角 (.10)、镍 (.05) 和便士 (.01)

包括选项,以便一种硬币可以有零个,或者每种硬币至少有一个。

示例问题:如果我有 19 个硬币,这些硬币加起来是 1.56 美元,并且每种硬币必须至少有 1 个。

答案是:

1 Quarters, 9 Dimes, 8 Nickels, 1 Pennies

2 Quarters, 5 Dimes, 11 Nickels, 1 Pennies

2 Quarters, 9 Dimes, 2 Nickels, 6 Pennies

3 Quarters, 1 Dimes, 14 Nickels, 1 Pennies

3 Quarters, 5 Dimes, 5 Nickels, 6 Pennies

4 Quarters, 1 Dimes, 8 Nickels, 6 Pennies

5 Quarters, 1 Dimes, 2 Nickels, 11 Pennies

如果我们允许一个硬币为零,我们就可以得到一个额外的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));
}

最佳答案

未经测试,但是:

        int minQuarters = 1, minDimes = 1,
minNickels = 1, minPennies = 1,
maxQuarters = 19, maxDimes = 19,
maxNickels = 19, maxPennies = 19,
coinCount = 19, total = 156;
var qry = from q in Enumerable.Range(minQuarters, maxQuarters)
from d in Enumerable.Range(minDimes, maxDimes)
from n in Enumerable.Range(minNickels, maxNickels)
from p in Enumerable.Range(minPennies, maxPennies)
where q + d + n + p == coinCount
where q * 25 + d * 10 + n * 5 + p == total
select new {q,d,n,p};
foreach (var row in qry)
{
Console.WriteLine("{0} quarter(s), {1} dime(s), {2} nickel(s) and {3} pennies",
row.q, row.d, row.n, row.p);
}

实际上,出于零售目的 - 也许更好的查询是“我可以给出的最少硬币是多少”?替换为:

...
from p in Enumerable.Range(minPennies, maxPennies)
where q + d + n + p <= coinCount
where q * 25 + d * 10 + n * 5 + p == total
orderby q + d + n + p
...

并使用 First()Take(...) ;-p

您还可以通过在 maxDimes 测试(等等...)中减去(例如)q 来减少检查案例的数量 - 类似(简化):

        int minCount = 1,
coinCount = 19, total = 156;
var qry = from q in Enumerable.Range(minCount, coinCount - (3 * minCount))
where q * 25 <= total
from d in Enumerable.Range(minCount, coinCount - (q + (2 * minCount)))
where q * 25 + d * 10 <= total
from n in Enumerable.Range(minCount, coinCount - (q + d + minCount))
where q * 25 + d * 10 + n * 5 <= total
from p in Enumerable.Range(minCount, coinCount - (q + d + n))
where q + d + n + p == coinCount
where q * 25 + d * 10 + n * 5 + p == total
select new { q, d, n, p };

关于c# - 有人可以滥用 LINQ 来解决这个金钱难题吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1352510/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com