为了快速实现我采用的是Go语言实现,其他语言逻辑一样:
/**********************************************
** @Des: monkey - example
** @Author: archerzdip
** @Date: 2019-03-01 23:22
** @Last Modified time: 2019-03-01 23:22
***********************************************/
package main
import "fmt"
func main() {
// 距离
distance := 100
// 最优解
bestLeft := 0
// 每次走的步数
for i := 1 ; i <= distance/2 ; i++ {
// 总数
total := 200
// 剩余
left := 0
// 走到第几步
for j := i ; j <= distance ; j += i {
leftStep := 100 - j
if total > 0 {
total -= i*3
}
if total > distance {
left = 100 - leftStep
} else {
left = total - leftStep
}
if left > bestLeft {
bestLeft = left
}
if total < 0 || left < 0 {
break
}
fmt.Printf("每次走%d步,当走到第%d步时,还剩香蕉%d根,距离终点还剩%d米,走到终点还剩%d根。\n", i,j,total,leftStep,left)
}
}
fmt.Printf("最优解为:%d根",bestLeft)
}
结果:
最优解为:33根
从结果中可以看出每走1米回去取剩余的,当走到33米的时候直接回去可剩余33根;每次走33米当走到33米的时候拿上100根直接回去也可剩余33根,所以33根为最优解。
该逻辑是我自己的理解,可能有问题欢迎指正。 感谢!!!