最大余数

给定n个整数, 从中选出若干个数字(每个数字最多选一次),使得它们的和取余m最大,求最大的余数。

输入

第一行输入两个整数n(1 le n le 35)n(1n35)和m(1 le m le 10^9)m(1m109)。

第二行输入n个整数,这些整数属于区间[1, 10^9][1,109]。

输出

输出一个整数作为答案。

样例

输入

复制
4 4
5 2 4 1

输出

复制
3

输入

复制
3 20
199 41 299

输出

复制
19

输入

复制
2 10
2 2

输出

复制
4

提示

子任务1,40分,1 le n le 161n16

子任务2,60分,1 le n le 351n35

#include <iostream>
#include <cstdio>
#include <vector>
#include <set>
#define MAX 40
using namespace std;
int main()
{
    int n, m;
    int d;
    int ans = 0;
    scanf("%d %d", &n, &m);
    int n1 = (n + 1) / 2;
    std::set<int> s[2];
    s[0].insert(0);
    s[1].insert(0);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &d);
        int flag = i >= n1;
        std::vector<int> temp;
        for (const int& num : s[flag])
        {
            temp.push_back((d + num) % m);
        }
        for (int& num : temp)
        {
            s[flag].insert(num);
        }
    }
    std::set<int>::reverse_iterator it = s[1].rbegin();
    for (auto& num : s[0])
    {
        while (it != s[1].rend() && num + *it >= m)
        {
            it++;
        }
        if (ans < (num + *it) % m)
        {
            ans = (num + *it) % m;
        }
    }
    printf("%d", ans);
}
如果觉得有帮助,点个推荐啦~
原文地址:https://www.cnblogs.com/8023spz/p/15470247.html