Algorithm 无DP的最小硬币
我已经使用迭代和动态规划编写了最少数量的coins程序。我看到很多博客讨论这个问题的DP。迭代解的运行时间为OnumberOfCoins*numberofCoins,DP的OnumberOfCoins*排列大致相同。哪一个更好?请推荐一本关于高级算法的好书Algorithm 无DP的最小硬币,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我已经使用迭代和动态规划编写了最少数量的coins程序。我看到很多博客讨论这个问题的DP。迭代解的运行时间为OnumberOfCoins*numberofCoins,DP的OnumberOfCoins*排列大致相同。哪一个更好?请推荐一本关于高级算法的好书 请使用{v1>v2>v3>v4}运行,如{25,10,5}我看到您试图测量这两种算法的运行时间,并决定哪一种更好 嗯,关于你的算法还有一件更重要的事情。不幸的是,第一个是不正确的。例如,请考虑以下输入: 假设我们想交换100枚硬币,可用硬币的
请使用{v1>v2>v3>v4}运行,如{25,10,5}我看到您试图测量这两种算法的运行时间,并决定哪一种更好 嗯,关于你的算法还有一件更重要的事情。不幸的是,第一个是不正确的。例如,请考虑以下输入:
假设我们想交换100枚硬币,可用硬币的名称如下:5、6、90、96。我们最多只能使用3枚硬币:5、5、90。但是,如果运行Console.writelineMiniconsnew int[]{3,2},4,那么您的解决方案将返回1您的代码将打印1而不是2;
public int MinCoins(int[] change, int cents)
{
Stopwatch sw = Stopwatch.StartNew();
int coins = 0;
int cent = 0;
int finalCount = cents;
for (int i = change.Length - 1; i >= 0; i--)
{
cent = cents;
for (int j = i; j <= change.Length - 1; j++)
{
coins += cent / change[j];
cent = cent % change[j];
if (cent == 0) break;
}
if (coins < finalCount)
{
finalCount = coins;
}
coins = 0;
}
sw.Stop();
var elapsedMs = sw.Elapsed.ToString(); ;
Console.WriteLine("time for non dp " + elapsedMs);
return finalCount;
}
public int MinCoinsDp(int[] change, int cents)
{
Stopwatch sw = Stopwatch.StartNew();
int[] minCoins = new int[cents + 1];
for (int i = 1; i <= cents; i++)
{
minCoins[i] = 99999;
for (int j = 0; j < change.Length; j++)
{
if(i >= change[j])
{
int n = minCoins[i - change[j]] + 1;
if (n < minCoins[i])
minCoins[i] = n;
}
}
}
sw.Stop();
var elapsedMs = sw.Elapsed.ToString();
Console.WriteLine("time for dp " + elapsedMs);
return minCoins[cents];
}