《程序员的算法趣题》-(日)增井敏克 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

猜你喜欢

转载自blog.csdn.net/cloudly89/article/details/84935493