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];
}
我使用迭代和动态编程编写了最少数量的硬币程序。我看过很多博客讨论这个问题的DP。迭代解决方案具有运行时间O(numberOfCoins * numberofCoins)并且DP具有大致相同的O(numberofcoins * arraySize)。哪一个更好?请为高级算法推荐好书。
请使用{v1&gt;运行v2&gt; v3&gt; v4}喜欢{25,10,5}
答案 0 :(得分:1)
我发现您正在尝试测量两种算法的运行时间并确定哪种算法更好。
嗯,你的算法有一个更重要的事情。不幸的是,第一个是不正确的。例如,请考虑以下输入:
假设我们要交换100
并且可用的硬币具有以下名称:5, 6, 90, 96
。我们能做的最好的事情就是使用3
硬币:5, 5, 90
。但是,您的解决方案会返回1