一、问题描述
二、问题分析
在满足问题的条件的情况下可以将问题简化描述为计算16个数字的所有可能的和的结果,并统计得到具有最大的频次的和。
由于只有16个数字,使用暴力法是可以做到的,从1个数和,2个数和,...,16个数和的计算并没有什么难度,但是其时间复杂度过高(),在输入进一步增大时,计算速度会变得很慢,那么需要对其进行改进。我们能够发现暴力法进行了大量的重复计算,我们的目的就是将这些重复计算省去,其中一种方法是动态规划,先计算前n-1个数的所有可能和,在基于其上计算n个数的所欲可能和。
三、代码实现
1.C/C++实现
#include <iostream>
#include <map>
using namespace std;
const int matrix[] = { 1, 14, 14, 4, 11, 7, 6, 9, 8, 10, 10, 5, 13, 2, 3, 15 };
const int length = 16;
int main()
{
map<int, int> sum_count;
sum_count[0] = 1;
for (int i = 0; i < length; i++)
{
map<int, int> temp;
for (auto item : sum_count)
temp[item.first + matrix[i]] = item.second;
for (auto item : temp)
{
if (sum_count.find(item.first) == sum_count.end())
sum_count[item.first] = 0;
sum_count[item.first] += item.second;
}
}
int max_sum = 0, max_count = 0;
for (auto item : sum_count)
if (max_count < item.second)
{
max_sum = item.first;
max_count = item.second;
}
cout << max_sum << '\t' << max_count << endl;
}
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)