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