扔雞蛋

扔雞蛋,有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層挨個試驗(yàn)
                // 分為兩種情況,要么蛋碎了,要么蛋沒碎
                // 1.蛋碎了, 說明k層以及大于k層不用測了,
                //   還需要測k-1層, 且只剩j-1個蛋
                // 2.蛋沒碎,說明k層以及小于k層不用測了,
                //   還需要測i-k層,且蛋還是j個
                // 無論如何都摔了一次,因此要加一
                // 因?yàn)?~k層,蛋碎,都有可能,因此需要取最大值
                tmp := max(dp[k-1][j-1], dp[i-k][j]) + 1
                // 因?yàn)榭梢詮?~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))
}
``
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容