二、问题分析
在满足问题的条件的情况下可以将问题简化描述为计算16个数字的所有可能的和的结果,并统计得到具有最大的频次的和。
由于只有16个数字,使用暴力法是可以做到的,从1个数和,2个数和,...,16个数和的计算并没有什么难度,但是其时间复杂度过高(),在输入进一步增大时,计算速度会变得很慢,那么需要对其进行改进。我们能够发现暴力法进行了大量的重复计算,我们的目的就是将这些重复计算省去,其中一种方法是动态规划,先计算前n-1个数的所有可能和,在基于其上计算n个数的所欲可能和。
三、代码实现 1.C/C++实现#include
#include
2.Python实现
# coding=utf-8
matrix = (1, 14, 14, 4,
11, 7, 6, 9,
8, 10, 10, 5,
13, 2, 3, 15)
if __name__ == '__main__':
sum_count = {0: 1}
for item in matrix:
# 把当前元素和已有的和一一组合
keys = tuple(sum_count.keys())
temp = {}
for key in keys:
temp[item + key] = sum_count[key]
# 对两个字典进行合并
for k in temp.keys():
if k not in sum_count.keys():
sum_count[k] = 0
sum_count[k] += temp[k]
# 找到最大的和
max_k = max_v = 0
for k, v in sum_count.items():
if max_v < v:
max_k = k
max_v = v
print(max_k, max_v)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)