没有DP的最小硬币

时间:2018-01-17 19:15:41

标签: algorithm dynamic-programming

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}

1 个答案:

答案 0 :(得分:1)

我发现您正在尝试测量两种算法的运行时间并确定哪种算法更好。

嗯,你的算法有一个更重要的事情。不幸的是,第一个是不正确的。例如,请考虑以下输入:

假设我们要交换100并且可用的硬币具有以下名称:5, 6, 90, 96。我们能做的最好的事情就是使用3硬币:5, 5, 90。但是,您的解决方案会返回1