在最坏的情况下鸡蛋下降

时间:2015-02-25 17:49:29

标签: function dynamic-programming

我一直在尝试编写一种算法来计算最坏情况下所需的最大数量或试验,以及掉蛋问题。这是我的python代码

def eggDrop(n,k):
   eggFloor=[ [0 for i in range(k+1) ] ]* (n+1)
 for i in range(1, n+1):  
    eggFloor[i][1] = 1
    eggFloor[i][0] = 0
 for j in range(1, k+1):
    eggFloor[1][j] = j
 for i in range (2, n+1):
    for j in range (2, k+1):
        eggFloor[i][j] = 'infinity'
        for x in range (1, j + 1):
            res = 1 + max(eggFloor[i-1][x-1], eggFloor[i][j-x])
            if res < eggFloor[i][j]:
                eggFloor[i][j] = res

 return eggFloor[n][k]print eggDrop(2, 100)

```

代码为2eggs和100floors输出值7,但答案应该是14,我不知道我在代码中犯了什么错误。有什么问题?

1 个答案:

答案 0 :(得分:1)

问题出在这一行:

eggFloor=[ [0 for i in range(k+1) ] ]* (n+1)

您希望这创建一个包含(n + 1)个(k + 1)个零列表的列表。 * (n+1)的作用略有不同 - 它会创建一个包含相同列表的(n + 1)个副本的列表。

这是一个重要的区别 - 因为当你开始修改列表中的条目时 - 比如说,

    eggFloor[i][1] = 1

这实际上会更改所有列表的元素[1],而不仅仅是i个列表。

要创建可以单独修改的单独列表,您需要以下内容:

eggFloor=[ [0 for i in range(k+1) ] for j in range(n+1) ]

通过此修改,程序按预期返回14.

(为了调试这个,最好写出一个函数来修剪eggFloor数组,并在程序的各个点显示它,这样你就可以将它与你期望的结果进行比较。很快就会变得非常清楚发生了什么!)