Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 如果我使用动态规划来解决硬币兑换问题,那么记忆矩阵将是什么?_Algorithm_Dynamic Programming_Coin Change - Fatal编程技术网

Algorithm 如果我使用动态规划来解决硬币兑换问题,那么记忆矩阵将是什么?

Algorithm 如果我使用动态规划来解决硬币兑换问题,那么记忆矩阵将是什么?,algorithm,dynamic-programming,coin-change,Algorithm,Dynamic Programming,Coin Change,对于硬币问题的动态规划技术,矩阵应该是什么样子,我感到困惑。 假设我的面额是1c、5c、10c和25c,我称之为“兑换”(10)。i、 e.我想换10美分,我的最终矩阵/数组应该是什么样的。我需要知道这一点,因为我想在程序开始时分配一个数组。我不是在这里找代码 我认为一个hashmap可以将一个数量映射到一个硬币列表。所以它看起来像: {0 => (), 1 => (1), 2 => (1,1), 3 => (1,1,1), ... 13 => (10,1

对于硬币问题的动态规划技术,矩阵应该是什么样子,我感到困惑。
假设我的面额是1c、5c、10c和25c,我称之为“兑换”(10)。i、 e.我想换10美分,我的最终矩阵/数组应该是什么样的。我需要知道这一点,因为我想在程序开始时分配一个数组。我不是在这里找代码

我认为一个hashmap可以将一个数量映射到一个硬币列表。所以它看起来像:

{0 => (),
 1 => (1),
 2 => (1,1),
 3 => (1,1,1),
 ...
 13 => (10,1,1,1)
 ...
}

您可以使用一个矩阵,其中一个维度显示您正在计算的金额,另一个维度显示您可以使用的货币-例如,第一行显示仅使用1c货币实现给定金额的方法的数量,第二行显示-1c和5c,第三行显示-1c、5c和10c,依此类推

因此,在您的示例中,它可能如下所示:

Sum:  0 1 2 3 4 5 6 7 8 9 10
Ways: 1 1 1 1 1 1 1 1 1 1 1   (using only 1c coins - N x 1c)
      1 1 1 1 1 2 2 2 2 2 3   (using 1c and 5c coins - either Nx1c, 1x5c + (N - 5)*1c or 2x5c)
      1 1 1 1 1 2 2 2 2 2 4   (using 1c, 5c and 10c coins - one of the above, or 1x10c)
不过,您实际上不需要存储整个矩阵-最后一行应该已经足够了

摆脱大部分矩阵的解释:

假设您只使用1c硬币(这不是一件非常困难的事情)就找到了答案,并且它存储在一个数组中,比如说
DP
。现在,你有了这些信息,你想知道1c和5c硬币的答案

您可以从
sum=0到10
,保持以下不变:

  • 当您计算
    sum
    的答案时,
    DP
    中0和
    sum-1之间的每个数字
    x
    的条目显示了使用1c和5c硬币获得
    sum
    的方法数。当仅使用1c硬币时,所有其他条目(从
    sum
    到数组末尾)都包含答案
维护它实际上相当简单:当您计算
x
的答案时,您知道:

  • 只使用1c硬币获得
    x
    的方法的数量-这是
    DP[x]
    ,因为我们还没有覆盖它
  • 使用至少一枚5c硬币获得
    x
    的方法的数量-即
    DP[x-5]
    ,即我们移除5c后获得剩余硬币数量的方法的数量(或0,如果
    x-5<0

然后,您可以将这两个数字相加,并将结果存储在
DP[x]
中。然后继续以类似的方式处理其余的硬币。

您到底想找到什么?求和10的不同方法的数量?是的,这是正确的。求和10的方法的数量为什么我不需要存储整个矩阵?为什么最后一排就够了?你能举一个10美分的例子来说明最后一行是如何足够的吗?请看编辑后的答案-它有点长,但我希望它是清楚的。嗨,伊万。你能在这里说明dp[10]是如何计算的,而不仅仅是x。dp[10]将如何实现?尝试模拟我手工描述的算法,它将帮助您更好地理解它。先用一些较小的数字,甚至可能用较小的硬币(例如1c、2c、5c)。如果你还有什么问题,你可以告诉我。如果你还没有弄清楚-使用1c、5c和10c硬币获得10的方法的数量-让我们称之为方法(10,3)-首先是总和,然后是我们使用的不同硬币的数量-是:方法(10,3)=方法(10-10,3)+方法(10,2)-第一个是“拿一枚10c硬币来说,你能用多少种方法得到剩下的”,第二种方法是只使用1c和5c硬币得到10的方法数。方法(0,3)=1,方法(10,2)=3通过类似的逻辑。