搜尋

首頁  >  問答  >  主體

c++ - 李白喝酒问题的算法

“李白街上走,提壶去买酒,遇店加一倍,见花喝一斗”,途中,遇见5次店,见了10此花,壶中原有2斗酒,最后刚好喝完酒,要求最后遇见的是花,求可能的情况有多少种?希望大家分享一下思路,谢谢!
我的思路很混乱,觉得直接暴力枚举能解决,但是枚举所有的情况比较不现实,希望大家解答啊!

PHPzPHPz2881 天前1970

全部回覆(13)我來回復

  • PHP中文网

    PHP中文网2017-04-17 11:24:48

    雷雷

    回覆
    0
  • 巴扎黑

    巴扎黑2017-04-17 11:24:48

    簡單的給一個非遞歸的python程式碼:

    queue = [(2, 5, 10)]
    total = 0
    def iter():
        global queue
        while queue:
            i, queue = queue[0], queue[1:]
            yield i
    
    for (left, dian, hua) in iter():
        if dian == 0:
            total += 1 if left == hua else 0
        else:
            if left > hua or left == 0 or hua ==0:
                continue
            queue.append((left*2, dian-1, hua))
            queue.append((left-1, dian, hua-1))
    

    回覆
    0
  • 大家讲道理

    大家讲道理2017-04-17 11:24:48

    暴力窮舉很好做,不再說了
    最後一次是見花的話,2經過說明經過14次變換之後值是1,
    10次​​見花之後是0的話,初始是2鬥酒,表示總共加了8鬥酒
    加酒最小值是1,最大值是4(11114),
    因為加酒是加倍方法,數列中相鄰兩個數倍差不能大於2倍,即11114這類被排除,可能加酒的數字在1-3的範圍內,同樣因為倍差原因,1後面只能是2(但是3後面可是1)
    因為初期值是2,第一次加酒只可能是1或2鬥
    於是找有幾個滿足條件的數列就行

    回覆
    0
  • 取消回覆