我正在解决以下问题从hackerrankhttps://www.hackerrank.com/challenges/coin-change/problem
我无法解决这个问题,所以我看了社论,他们提到
T(i, m)=T(i, m-i)T(i 1, m)
我无法从整体上理解为什么这个解决方案在更高的层次上有效。(如CLRS中的证明或简单易懂的示例)
我写的解决方案如下
fun(m){
//base cases
count = 0;
for(i..n){
count+= fun(m-i);
}
}
我的解决方案不起作用,因为有一些重复的调用。但是编辑是如何工作的,以及我的解决方案和更高层次的编辑之间的区别是什么...
我认为,为了让它起作用,你必须清楚地定义T是什么。也就是说,我们将T(i,m)定义为仅使用索引至少为i的硬币对m个单位进行更改的方式的数量(即,我们只查看第i个硬币,第(i 1)个硬币,一直到第n个硬币,而忽略第一个i-1硬币)。此外,我们定义了一个数组C,使得C[i]是第i枚硬币的值(注意,通常C[i]与i不同)。因此,如果有n个硬币(即C的长度为n),并且我们想要对W单位进行更改,我们将寻找值T(0,W)作为我们的答案(确保您可以看到为什么此时会出现这种情况!)。
现在,我们继续构造T(i,m)的递归定义。请注意,我们的解决方案要么包含一个额外的第i个硬币,要么不包含。如果它包含,我们的新目标将只是m-C[i],对此进行更改的方法的数量是t(i,m-C[i])(因为我们的新目标现在是C[i]小于m)。在另一种情况下,我们的解决方案不包含第i个硬币。在这种情况下,我们保持目标值相同,但只考虑指数大于I的硬币,即,在这种情况下,改变的方法的数量是T(i 1,m)。由于这些情况是不相交且详尽的(要么在解决方案中放入第i个硬币,要么不放入!),我们有
T(i,m) = T(i, m-C[i]) + T(i+1,m)
这与你的情况非常相似(C[i]的差异很重要)。注意,如果m
现在仍然需要计算T(0,W),您可以轻松地递归地进行计算。然而,您可能注意到许多子问题被重复,这使得这是一个缓慢的解决方案。解决方案是使用一种叫做动态编程或记忆的方法。即,每当计算一个解时,将其值添加到一个表中(例如,T[i,m],其中T是一个nxw大小的二维数组)。然后,当你递归地计算某个东西时,首先检查表,这样你就不会对同一个东西计算两次。这就是所谓的回忆录。动态规划很简单,除非你有一点远见,按照需要的顺序来计算。例如,我将首先计算基本情况,即列T[,0]。然后,我将根据递归定义计算与该行和该列相邻的所有值。
我在理解各种问题的动态规划解决方案方面存在问题,特别是硬币兑换问题: “给定一个值N,如果我们想换N美分,并且我们有无限多个S={S1,S2,…,Sm}值的硬币,我们可以用多少种方式来换?硬币的顺序并不重要。 例如,对于N=4和S={1,2,3},有四种解决方案:{1,1,1},{1,1,2},{2,2},{1,3}。所以输出应该是4。对于N=10和S={2,5,3,6},有五个解:{2,2,2,
这是我关于硬币更换问题的代码,用于打印一组硬币的总方式数和目标金额 我想知道是否有任何方法可以用相同的动态规划解决方案打印这些方法(借助内部构造的表或任何其他方法) 例如,如果一组硬币是[1,3,5],目标金额是6,那么总共有4种可能的方式。[1,1,1,1,1,1,1,],[1,1,1,3],[3,3],[1,5]]我希望这种方式的列表作为输出。
我编写的代码使用动态规划解决了基本的硬币兑换问题,并给出了进行兑换所需的最小硬币数量。但是我想把每个硬币的数量存储在最小的数字里。 我试图做的是初始化数组,就像散列一样,只要找到,它就会增加的数量,即。但这并不是我想要的方式,因为它每次发现对应于时都会添加硬币。因此,在最终答案中,数字不是硬币的最终计数。 代码如下:
但是我们不能这样做吗:(是给定的可用硬币的排序集,和是它的下标,是给定的最高价值硬币) 我写的东西有什么问题吗?虽然解决方案不是动态的,但不是更有效吗?
在硬币系统C={c1,c2,…ck}中,应改变给定的数量x,以使每个硬币ci具有给定的重量wi。我们想计算可能变化的总重量。两种变化是不同的,如果他们包含在不同的顺序相同的硬币。 如何给出上述问题的动态规划递归?我知道最小硬币兑换问题的递归(即C(x)=min{C(x-C)1 for x
问题-你会得到不同面额的硬币和总金额。写一个函数来计算你需要的最少数量的硬币来组成这个数量。那里有无限的硬币供应。 我的方法——我遵循了自上而下的方法,但是使用map stl进行记忆,我得到了TLE。请帮助找出误差和估计时间复杂度。 这是我的密码-