扔鸡蛋

作者: wncbbnk | 来源:发表于2021-12-23 20:26 被阅读0次

    扔鸡蛋,有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))
    }
    ``

    相关文章

      网友评论

          本文标题:扔鸡蛋

          本文链接:https://www.haomeiwen.com/subject/vdlkqrtx.html