我搜索了这个硬币更改问题的运行时复杂性,特别是使用动态编程方法。但无法在任何地方找到解释。
如何计算非动态解决方案的复杂性,然后针对动态解决方案进行更改? (不是贪婪的人)
修改
以下是要求进行分析的实施方案。
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爆炸给我。但是我不确定如何推断出运行时间的复杂性。
答案 0 :(得分:2)
此问题的dynamic programming solution 清楚 O(k * n)
(嵌套循环,等等等等)其中k
是硬币数量n
是改变的金额。
我不知道非动态编程解决方案的含义。对不起,您将指定您的算法。在某些情况下greedy algorithm fails,所以不应该指的是那个。你的意思是线性编程解决方案吗?这是解决这个问题的一种可怕方法,因为我们不知道复杂性是什么,并且可以让它以任意缓慢的方式运行。
我也不知道你的意思是“为动态的改变它。”