如何解决最优面额的递归硬币找零算法
我想为请求的值找到最佳的面额数。我已经在这篇文章 How to get the least possible combination for a coin change problem in C# using recursion 中使用了 Eugene Chybisov 提供的 Coin Change 算法,它可以满足我的需求。下面是他的c#代码。这非常有效,并且根据我的需要进行一些调整可以实现我需要的大部分内容。我遇到了一个关于递归的问题。如果我们有大量的面额(比如 { 2,5,10,12,15,18,20,25,30,40,50,60,65,75,80,100,150,200,250,500})和高要求的价值说( 500)这个递归将永远持续下去。一旦我们降低了整体请求值,记忆化是否有效?贪心算法和递归算法如何混合或混合使用?
static List<int> resultCoins = new List<int>();
static void Main()
{
List<int> amounts = new List<int>() { 2,10 };
Change(new List<int>(),amounts,21);
Display(resultCoins,amounts);
}
static void Change(List<int> coins,List<int> amounts,int highest,int sum,int goal)
{
if (sum == goal)
{
resultCoins = coins;
return;
}
if (sum > goal)
{
return;
}
foreach (int value in amounts)
{
if (value >= highest)
{
List<int> copy = new List<int>(coins);
copy.Add(value);
Change(copy,value,sum + value,goal);
}
}
}
static void Display(List<int> coins,List<int> amounts)
{
foreach (int amount in amounts)
{
int count = coins.Count(value => value == amount);
Console.WriteLine("{0}: {1}",amount,count);
}
Console.WriteLine();
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。