扔鸡蛋

扔鸡蛋,有egg个鸡蛋,楼高度为floor层。
问,至少扔几次,才能确定鸡蛋最多在哪一层,不碎

package main

import (
    "fmt"
    "math"
)

func getMinFloorNumber(floor, egg int) int {
    dp := make([][]int, floor+1)
    for i := 0; i < floor+1; i++ {
        dp[i] = make([]int, egg+1)
    }
    for i := 0; i < floor+1; i++ {
        for j := 0; j < egg+1; j++ {
            dp[i][j] = math.MaxInt32
        }
    }
    // i层楼,1个鸡蛋,必须都遍历一遍
    for i := 1; i < floor+1; i++ {
        dp[i][1] = i
    }

    for i := 1; i < egg+1; i++ {
                // 0层楼,不需要扔
        dp[0][i] = 0
                // 1层楼,需要扔一次
        dp[1][i] = 1
    }

    for i := 2; i < floor+1; i++ {
        for j := 2; j < egg+1; j++ {
            for k := 1; k <= i; k++ {
                // 从1层到k层挨个试验
                // 分为两种情况,要么蛋碎了,要么蛋没碎
                // 1.蛋碎了, 说明k层以及大于k层不用测了,
                //   还需要测k-1层, 且只剩j-1个蛋
                // 2.蛋没碎,说明k层以及小于k层不用测了,
                //   还需要测i-k层,且蛋还是j个
                // 无论如何都摔了一次,因此要加一
                // 因为1~k层,蛋碎,都有可能,因此需要取最大值
                tmp := max(dp[k-1][j-1], dp[i-k][j]) + 1
                // 因为可以从1~i层扔,每次只能选一种情况,因此选择最小值
                // 这里取所有方法的最小值
                dp[i][j] = min(tmp, dp[i][j])
            }
        }
    }

    return dp[floor][egg]
}

func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

func main() {
    fmt.Printf("rst:%d\n", getMinFloorNumber(100, 2))
}
``

你可能感兴趣的:(扔鸡蛋)