硬币变化分析

时间:2013-06-21 03:39:46

标签: algorithm

<1,3>}面额硬币;总和= 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;
}

看起来像Combinatorial爆炸给我。但是我不确定如何推断出运行时间的复杂性。

1 个答案:

答案 0 :(得分:2)

此问题的dynamic programming solution 清楚 O(k * n)(嵌套循环,等等等等)其中k是硬币数量n是改变的金额。

我不知道非动态编程解决方案的含义。对不起,您将指定您的算法。在某些情况下greedy algorithm fails,所以不应该指的是那个。你的意思是线性编程解决方案吗?这是解决这个问题的一种可怕方法,因为我们不知道复杂性是什么,并且可以让它以任意缓慢的方式运行。

我也不知道你的意思是“为动态的改变它。”