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
C++ 在换硬币的过程中找到了很多方法来求和?_C++_Algorithm_Dynamic Programming - Fatal编程技术网

C++ 在换硬币的过程中找到了很多方法来求和?

C++ 在换硬币的过程中找到了很多方法来求和?,c++,algorithm,dynamic-programming,C++,Algorithm,Dynamic Programming,给定一个值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,2,2},{2,2,3,3},{2,2,6},{2,3,5}和{5,5}。所以输出应该是5 现在,我有一个疑问。为什么我们不能做一些像 arr[i]=arr[i-1]+arr

给定一个值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,2,2},{2,2,3,3},{2,2,6},{2,3,5}和{5,5}。所以输出应该是5

现在,我有一个疑问。为什么我们不能做一些像

arr[i]=arr[i-1]+arr[i-2]+arr[i-3]

这基本上是,
arr[i]
存储求和的方法的数量
i
。我在这里给出的方法有点类似于
n楼梯问题
,即我可以爬固定数量的楼梯,也就是说,一次爬一个楼梯,或者一次爬两个楼梯,我必须计算从底部到达顶部的方式总数。为什么我们不能在这个问题上使用类似的方法

为什么我们不能在这个问题上使用类似的方法

这是行不通的,因为在n楼梯问题中,顺序很重要。例如,如果您正在爬5级楼梯,{1,2,1,1}被视为与{1,1,2,1}不同

然而,在兑换问题中,只有每个硬币的总计数,而不是您添加它们的顺序,因此,如果您要兑换$5,{$1,$2,$1,$1}与{$1,$1,$2,$1}相同。因此,简单的记忆方法不起作用,您需要存储所有可能达到arr[i]的方法,而不仅仅是总数

例如,假设您试图用$1和$2赚取$6。你不能把赚4美元的方法的数量加在赚5美元的方法的数量上,因为(例如)赚4美元的方法之一是{1,$1,$2}(你可以加上$2来赚6美元,即{$1,$1,$2,$2}),而赚5美元的方法之一是{$1,$2,}(你可以加上$1来赚6{$1,$2,$2,$1})


然而,{$1、$2、$2、$1}和{$1、$1、$2、$2}不应该分开计算。

Samgak的回答解释了改变与一次爬一步或两步楼梯的区别:改变的顺序并不重要,但爬楼梯的顺序很重要


你可以用动态规划来解决这个问题,但是你需要一个更复杂的状态。让
a[i][j]
为i货币单位的兑换方式,仅使用硬币的前j面额。所以,
a[0][0]=1
a[i][0]=0
对于i大于0,对于j大于0,
a[i][j]=a[i][j-1]+a[i-Sj][j-1]+a[i-2*Sj][j-1]+…
,你为什么不尝试实现这个想法,并把它放在这里?我不认为我们有任何规则不使用任何类型的方法/想法。我想问的是,这是解决这个问题的正确方法吗?此外,我不是要求你帮我编写问题代码或调试一些代码,我想知道的是,这是解决上述问题的正确方法吗?它不起作用,因为你可能会添加相同的情况(假设忽略顺序)。动态编程通常被提到递归的替代方法。话虽如此,您能考虑一下递归解决方案与您所想的有什么不同吗?关键是,最好看看您的实现,并指出哪一个出了问题。仅凭您的描述,很难说什么(至少是伪代码)。同意吗?对。我该怎么做呢?我是否应该继续在每个步骤中存储所有可能的解决方案?好吧,只需存储一个元组,该元组的值与每个解决方案的硬币数量相同。没那么复杂,明白了。令人惊讶的例子。清除了一切@桑加克,非常感谢你的帮助。非常感谢。