丢鸡蛋问题(Egg Dropping Puzzle) -- 动态规划

丢鸡蛋问题(Egg Dropping Puzzle)

丢鸡蛋问题的描述:有两个鸡蛋和一栋36层高的楼,我们希望知道36层高的哪个楼层把鸡蛋扔下会破裂,在哪些楼层扔鸡蛋不会使得鸡蛋破裂。我们做一些假设:

 -  落下来的没有破碎鸡蛋可以再次使用
 -  碎的鸡蛋不能够再次使用
 -  如果鸡蛋掉落时破裂,那么如果从较高的楼层掉落,鸡蛋也会破裂
 -  如果鸡蛋在跌落中没有破裂,那么它会在较低的楼层跌落也不会破裂
 -  在一楼丢鸡蛋可能会破裂,在36楼丢鸡蛋可能不会破裂

如果只有一个鸡蛋,则只能以一种方式进行实验。 从一楼往下扔鸡蛋; 如果它没碎,则将其从二楼扔出。 继续向上直到鸡蛋破裂。 在最坏的情况下,此方法可能需要丢弃36次。 假设有两个鸡蛋, 那么我们应该扔多少次才能找到不会让鸡蛋碎的最高楼层?
问题实际上并不是找到最低的楼层,而是确定应该从哪层楼往下扔可以使得实验的次数最小。

问题思路:
假设我们从x层楼上将鸡蛋扔出,此时有两种情况

	 1	如果鸡蛋碎了,我们只需要用剩下的鸡蛋检查x - 1层楼。
	 2	如果鸡蛋没碎,鸡蛋的数量没变,并且我们只需要检查 k - x层楼。

我们要求最坏情况下的试验次数的最小值,对于每层楼,我们取以上两种情况的最大值,然后选择可以让实验次数最小的楼层
问题模型:
k: 楼层高度
n: 鸡蛋数量
eggDrop(n,k) 在最坏情况下 要找到关键楼层(使得鸡蛋不碎的最高楼层)需要试验的次数
eggDrop(n,k) = 1 + min{max(eggDrop(n-1,x-1),eggDrop(n,k-x)), x 的取值范围{1,2…,k}
代码

public class Solution{
    
    public int eggDrop(int n, int k) 
    {
    
        if (k == 1 || k == 0)  //0层楼不用实验,1层楼只需要实验一次
            return k; 
        if (n == 1) //一
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值