酒瓶换酒

"""
一开始有5瓶啤酒
两个空酒瓶换一瓶啤酒
四个瓶盖换一瓶啤酒
问你最后能够喝到多少瓶啤酒
"""


def get(n):
    bottle, head = n, n
    drink = 0
    while 1:
        drink += bottle
        use = bottle // 2 + head // 4
        if use == 0:
            break
        bottle %= 2
        head %= 4
        bottle += use
        head += use
    return drink


def recursive(bottle, head):
    """
    use=b//2+head//4
    f(b,h)=f(use+bottle%2,use+head%4)+bottle
    
    利用这个递推式可能能找到O(1)的算法
    
    :param bottle: 
    :param head: 
    :return: 
    """
    use = bottle // 2 + head // 4
    if use == 0:
        return bottle
    return recursive(use + bottle % 2, use + head % 4) + bottle

for i in range(1, 100):
    print(get(i), recursive(i, i))

"""
如果每瓶啤酒中奖的概率是p
那么期望得到多少瓶啤酒
"""

转载于:https://www.cnblogs.com/weiyinfu/p/9569375.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值