1. 程式人生 > >《程式設計師的演算法趣題》-(日)增井敏克 Python解題 -- (Q20)

《程式設計師的演算法趣題》-(日)增井敏克 Python解題 -- (Q20)

《程式設計師的演算法趣題》-(日)增井敏克 , 書中為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