算法趣题-Q20

算法趣题-Q20,第1张

一、问题描述

 

二、问题分析

        在满足问题的条件的情况下可以将问题简化描述为计算16个数字的所有可能的和的结果,并统计得到具有最大的频次的和。

        由于只有16个数字,使用暴力法是可以做到的,从1个数和,2个数和,...,16个数和的计算并没有什么难度,但是其时间复杂度过高(),在输入进一步增大时,计算速度会变得很慢,那么需要对其进行改进。我们能够发现暴力法进行了大量的重复计算,我们的目的就是将这些重复计算省去,其中一种方法是动态规划,先计算前n-1个数的所有可能和,在基于其上计算n个数的所欲可能和。

三、代码实现 1.C/C++实现
#include 
#include 

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 sum_count;
    sum_count[0] = 1;
    for (int i = 0; i < length; i++)
    {
        map 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)

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1325887.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-12
下一篇 2022-06-12

发表评论

登录后才能评论

评论列表(0条)

保存