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 - Fatal编程技术网

Algorithm 硬币兑换分析

Algorithm 硬币兑换分析,algorithm,Algorithm,{1,3,5}面额硬币;总和=11。 找出可用于计算总和的最小硬币数 (我们可以使用每种面额的任意数量的硬币) 我搜索了这个硬币兑换问题的运行时复杂性,特别是使用动态规划方法。但在任何地方都找不到解释 如何计算非动态解的复杂度,然后将其转化为动态解?(不是那个贪婪的人) 编辑: 下面是一个需要进行分析的实现 public int findCoinChange(int[] coins, int sum,int count) { int ret = 0, maxRet = -1;

{1,3,5}面额硬币;总和=11。 找出可用于计算总和的最小硬币数 (我们可以使用每种面额的任意数量的硬币)

我搜索了这个硬币兑换问题的运行时复杂性,特别是使用动态规划方法。但在任何地方都找不到解释

如何计算非动态解的复杂度,然后将其转化为动态解?(不是那个贪婪的人)

编辑:

下面是一个需要进行分析的实现

public int findCoinChange(int[] coins, int sum,int count) {

    int ret = 0, maxRet = -1;
    if(sum ==0)maxRet = count;
    else if(sum < 0)maxRet = -1;
    else{
        for(int i:coins){
            ret = findCoinChange(coins, sum - i,count+1);
            if(maxRet< 0)maxRet = ret;
            else if(ret >=0 && ret < maxRet){
                    maxRet = ret;
                }
            }
    }
    if(maxRet < 0)return -1;
    else return maxRet;
}
public int findCoinChange(int[]硬币,int总和,int计数){
int-ret=0,maxRet=-1;
如果(sum==0)maxRet=count;
如果(总和<0)maxRet=-1;
否则{
货币(国际货币:硬币){
ret=FindCinchange(硬币,总和-i,计数+1);
如果(maxRet<0)maxRet=ret;
else if(ret>=0&&ret
在我看来像是组合爆炸。然而,我不确定如何推断出这个问题的运行时复杂性。

这个问题的答案显然是
O(k*n)
(嵌套循环,诸如此类),其中
k
是硬币的数量,
n
是正在进行更改的金额

我不知道你说的非动态规划解是什么意思。抱歉,您需要指定您所指的算法。在某些情况下,这是一个问题,所以你不应该提到它。你是说线性规划解吗?这是解决这个问题的一个糟糕的方法,因为我们不知道复杂性是什么,并且有可能使它任意缓慢地运行


我也不知道你所说的“将其更改为动态的”是什么意思。

相关:我认为贪心不适用于这个问题。四个贪心并不总是给出最佳解决方案,例如Sum=9;{1,4,5}贪婪将给出-{5,1,1,1,1}最优值是{4,4}@arpitgautam正确的。这就是我的意思。如果一个程序对某些输入有效,而对其他输入无效,则不能认为它是正确的程序。所以贪婪是行不通的。你在评论中的例子应该是{4,5}对,这是一个打字错误。你是对的,贪婪和线性是不行的。我指的是使用递归。我们试图通过从和中减去一个面额,然后求解子问题,将问题简化为子问题。如果我们最后得到一个零,我们就有了一条可追踪的路径,毕竟我们会寻找最小的路径。问题是关于分析硬币兑换问题递归解的复杂性。这不是贪婪的/dp解决方案。我试一试——递归树最多是
n*k
深。但是它有很多分支都有重复的。我不知道如何从这里开始。@Raghu:从问题中:“我搜索了这个硬币兑换问题的运行时复杂性,特别是使用动态规划方法。但在任何地方都找不到解释。”递归解的复杂性将很像计算斐波那契序列的递归解。然而,Fib构建了一个二叉树,其复杂性很容易被认为是O(2^n)。改变的产生将取决于您面值硬币的数量和大小,例如集合D={1,5,12,25}随着n变得更大,更多的面值集合将发挥作用,导致更多的子代朝树的根方向移动。我想,一般来说,你可以放心地说O(k^n)。对于复杂度分析,该问题是整数背包问题的一个特例,它是弱np难问题,可以在伪多项式时间内求解。