《程式設計師的演算法趣題》-(日)增井敏克 Python解題 -- (Q20)
阿新 • • 發佈:2018-12-14
《程式設計師的演算法趣題》-(日)增井敏克 , 書中為69 道數學謎題編寫了解題程式, 程式語言為:Ruby,JavaScript,C語言。有興趣的同學,可以購書閱讀~
在此更新個人編寫的Python版,僅供學習使用。(執行環境:Python3.6)
Q20 受難立面魔方陣
西班牙有個著名景點叫聖家堂,其中“受難立面”上主要畫著耶穌從“最後的晚餐”到“昇天”的場景,其中還有一個如圖所示的魔方陣,因“縱、橫、對角線的數字之和都是 33”而聞名(據說耶穌辭世時是 33 歲)。
如果不侷限於由縱、橫、對角線的數字相加,那麼和數為 33 的組合有 310 種之多(網上有很多“4 個數字相加……”這樣的問題,如果限定只能由 4 個數字相加,則是 88 種)
問題
使用這個魔方陣,進行滿足下列條件的加法運算,求“和相同的組合”的種數最多時的和。
【條件】
● 不限於由縱、橫、對角線上的數字相加
● 加數的個數不限於 4 個
※ 能得出 33 這個“和”的組合共有 310 種。因此,如果組合數沒有超過 310 種,那麼最後答案就是 33。
from itertools import combinations from operator import itemgetter suffer_array = [1, 14, 14, 4, 11, 7, 6, 9, 8, 10, 10, 5, 13, 2, 3, 15] sum_map = {} for i in range(len(suffer_array)): for numbers in combinations(suffer_array, i): numbers_sum = sum(numbers) if numbers_sum in sum_map: sum_map[numbers_sum] += 1 else: sum_map[numbers_sum] = 1 print("種數最多時的和為: %s" % (max(sum_map.items(), key=itemgetter(1))[0]))
執行結果:
種數最多時的和為: 66