Python 程式設計1000例(13):經典問題——百錢買百雞

文章目錄

  • 一、需求及分析
  • 二、程式碼實現

本系列文章透過 1000(一篇文章表示 1 個例項) 個例項 ,為讀者提供較為詳細的練習題目,以便讀者舉一反三,深度學習。本系列的文章涉及到 Python 知識點包括:Python 語言基礎、運算子和運算式、敘述和程式結構、串列和元組、字典和集合、字串、正規表示式、函式、物件導向程式設計、模組和包、異常處理和程式除錯、檔案和目錄操作、資料庫程式設計、介面程式設計、網路程式設計、WEB 程式設計、行程和執行緒、網路爬蟲、遊戲程式設計等知識點,由易到難,由淺入深,一步步打下堅實的程式設計基礎。

本系列文章涉及的演算法包括搜尋、回溯、遞迴、排序、迭代、貪婪、分治和動態規劃等,涉及的資料結構包括字串、串列、指標、區間、佇列、矩陣、堆疊、連結串列、雜湊表、線段樹、二元樹、二元搜尋樹和圖結構等。

本系列文章是筆者為適應當前教育改革的創新要求,更好地踐行語言類課程,滿足實踐教學與創新能力培養的需要,閱讀大量書籍、各大網際網路公司的面試演算法、LintCode、LeetCode、九章演算法和結合筆者近幾年專案經驗撰寫的系列文章,精選了 1000 個趣味性、實用性強的應用例項,從不同難度、不同演算法、不同型態和不同資料結構等方面,將實際演算法進行總結,希望為 Python 程式設計人員拋磚引玉。由於筆者經驗與水平有限,博文中疏漏及不妥之處在所難免,衷心地希望各位讀者在評論區多提寶貴意見及具體的修改建議,以便筆者進一步修改和完善。

一、需求及分析

需求:即用一百錢買一百隻雞,而雞的品種有公雞、母雞和雛雞,價格分別是,一隻公雞5錢;一隻母雞3錢;三隻雛雞1錢。要求每個品種的雞至少買一隻,問:怎樣買才能滿足用一百錢買一百隻雞的要求。分析如下:

條件1:買的公雞、母雞、雛雞相加起來的數量是100,如下圖所示:

條件2:根據不同型態的雞價格不同,所花的錢數是100,如下圖所示:

演算法解析如下:

  1. 根據條件2,計算每一種雞最多能買多少只? ① 如果儘可能多地購買公雞,那麼公雞購買的範圍在 1~19 只之間,且不能超過 20。因為,如果購買 20 只公雞,就需要花費100錢(20×5=100),這樣無法購買母雞和雛雞,不符合題意;② 同理,如果儘可能多地購買母雞,那麼母雞購買的範圍在 1~32 只之間,且不能超過 33。因為,如果購買 33 只母雞需要花 99 錢(3×33=99),這樣無法購買公雞和雛雞,不符合題意。③ 根據條件,3 只雛雞需要花 1 錢,所以要買雛雞,就得一起買 3 只雛雞,因此雛雞應為 3 的倍數,故遞增的步長可以設為 3。如果儘可能多地買雛雞,買雛雞的範圍在 3~99 只之間,因為購買雞的數量要控制為一百隻雞, 1~100 之間且是3的倍數,範圍就是3~99。
  2. 根據以上演算法解析求出的公雞、母雞以及雛雞範圍內列出三重迴圈,進行窮舉,使兩個代數式成立,則為百錢買百雞的解。
  3. 利用 Python 實現百錢買百雞。

二、程式碼實現

1
2
3
4
5
6
7
for cock in range(1, 20):  # 遍歷公雞個數
    for hen in range(1, 33):  # 遍歷母雞個數
        for chick in range(3, 99, 3):  # 遍歷雛雞個數
            # cock = 1 hen = 1 chick =3
            # 百錢買百雞條件
            if cock + hen + chick == 100 and cock * 5 + hen * 3 + chick // 3 == 100:
                print(f"公雞:{cock},母雞:{hen},雛雞:{chick}")  # 輸出結果

程式執行結果如下圖所示: