Algorithm 无DP的最小硬币

Algorithm 无DP的最小硬币,algorithm,dynamic-programming,Algorithm,Dynamic Programming,我已经使用迭代和动态规划编写了最少数量的coins程序。我看到很多博客讨论这个问题的DP。迭代解的运行时间为OnumberOfCoins*numberofCoins,DP的OnumberOfCoins*排列大致相同。哪一个更好?请推荐一本关于高级算法的好书 请使用{v1>v2>v3>v4}运行,如{25,10,5}我看到您试图测量这两种算法的运行时间,并决定哪一种更好 嗯,关于你的算法还有一件更重要的事情。不幸的是,第一个是不正确的。例如,请考虑以下输入: 假设我们想交换100枚硬币,可用硬币的

我已经使用迭代和动态规划编写了最少数量的coins程序。我看到很多博客讨论这个问题的DP。迭代解的运行时间为OnumberOfCoins*numberofCoins,DP的OnumberOfCoins*排列大致相同。哪一个更好?请推荐一本关于高级算法的好书


请使用{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];
}