分析硬币变化的时间复杂度

时间:2016-04-03 20:44:55

标签: dynamic-programming

我们正在做一个经典的问题,即确定我们可以通过一组硬币进行更改的方式数量达到Z.

例如,Amount = 5,Coins = {1,2,3}。我们可以做出5的一种方法是{2,3}。

天真的递归解决方案具有阶乘时间的时间复杂度。

  

f(n)= n * f(n-1)= n!

我的教授认为它实际上具有O(2^n)的时间复杂度,因为我们只选择使用硬币。这在直觉上是有道理的。然而,为什么我的复发无法成为O(2^n)

修改

我的再现如下:

   f(5, {1, 2, 3})
     /           \                     .....
f(4, {2, 3})  f(3, {1, 3})        .....

注意每一步的分支因子如何减少1。

形式上。

  

T(n)= n * F(n-1)= n!

1 个答案:

答案 0 :(得分:0)

重复并不会达到预期的效果,因为它并不能反映算法所做的操作次数。

如果算法决定每个硬币是否输出,那么您可以使用T(n) = 2*T(n-1) + O(1)的重复T(1)=O(1)来模拟其时间复杂度;直觉是,对于每枚硬币,你有两种选择 - 输出硬币与否;这显然解决了T(n)=O(2^n)

相关问题