题目:Subset of Five
来源:吉林大学ACM集训队选拔赛(重现赛)

解题思路

集合 A 中有 n 个不同的整数。找出它的一个子集 S,使得 S 中元素之和能够被 5 整除,求 S 中元素之和的最大值。

res[i] 表示模为 i 时,当前元素之和的最大值。
pre[i] 表示模为 i 时,前一步元素之和的最大值。

C++代码

#include<iostream>
using namespace std;

long long pre[5];
long long res[5];

int main(){
    int n;
    cin >> n;
    int a;
    for(int i=0; i<n; ++i){
        cin >> a;
        for(int j=0; j<5; ++j){
            long long sum = pre[j] + a;
            int k = sum % 5;
            res[k] = max(res[k], sum);
        }
        for(int j=0; j<5; ++j)
            pre[j] = res[j];
    }
    cout << res[0] << endl;
    return 0;
}