最坏情况下掉蛋

Egg dropping in worst case

我一直在尝试编写一种算法来计算在最坏情况下,即鸡蛋掉落问题中所需的最大试验次数。这是我的 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,我不知道我在代码中犯了什么错误。有什么问题?

问题出在这一行:

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

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

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

    eggFloor[i][1] = 1

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

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

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

通过此修改,程序 returns 14 符合预期。

(要对此进行调试,编写一个函数来弹出 eggFloor 数组并在程序的不同位置显示它可能是个好主意,这样您就可以将它与您的预期进行比较。很快就会很清楚发生了什么!)