[基礎算法系列] —— 枚舉算法

百雞百錢問題

雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?

———— 《算經》python

前提:100只雞 + 100塊錢,100塊錢須所有用完。算法

設購買公雞、母雞、小雞的數量分別爲x、y、z,則題目可轉化爲三元二次方程組。app

x + y + z = 100

5*x + 3*y + z/3 = 100ide

由題意可知x、y、z的範圍分別爲[0, 20]、[0, 33]、[0, 100]。code

分析到這裏,不難寫出以下代碼。get

def solution():
    ans = []
    for x in range(20):
        for y in range(33):
            for z in range(100):
                r1 = x + y + z == 100
                r2 = 5*x + 3*y + z/3 == 100
                if r1 and r2:
                    ans.append([x, y, z])
    return ans
# [[0, 25, 75], [3, 20, 77], [4, 18, 78], [7, 13, 80], [8, 11, 81], [11, 6, 83], [12, 4, 84]]

可是經過分析代碼,不難發如今程序中咱們沒有必要進行三層循環。數學

將三元二次方程組轉換爲二元一次方程,因爲z的範圍較大,咱們選擇枚舉x、y的值。io

def solution():
    ans = []
    for x in range(20):
        for y in range(33):
            z = 100 - x - y
            if 5*x + 3*y + z/3 == 100:
                ans.append([x, y, z])
    return ans
# [[0, 25, 75], [3, 20, 77], [4, 18, 78], [7, 13, 80], [8, 11, 81], [11, 6, 83], [12, 4, 84]]

百雞百錢問題到此就成功解決了,由上述分析咱們能夠得出枚舉算法的流程。class

  1. 創建數學模型,找出解空間。
  2. 思考是否須要枚舉全局解空間?
  3. 選擇合適的枚舉順序。

推薦閱讀:循環

枚舉 - OI Wiki

算法分享-枚舉一種簡單而又粗暴的算法讓你明白爲啥要用複雜密碼-碼農視野

相關文章
相關標籤/搜索