算法趣题-Q20

一、问题描述

 

二、问题分析

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值