挣牛币用...

动态规划

初始化是这样的,转移方程是那样的,然后就能求出结果了

#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e13;
signed main() {
    int n, k;
    cin >> n >> k;
    vector<int> arr(n);
    for (auto& i : arr) {
        cin >> i;
    }
    vector<vector<int>> dp(n, vector<int>(k, -1));
    dp[0][arr[0] % k] = arr[0];
    for (int i = 1; i < n; ++i) 
    {
        int t = arr[i] % k;
        dp[i] = dp[i - 1];
        dp[i][arr[i] % k] = max(dp[i][arr[i] % k], arr[i]);
        for (int j = 0; j < k; ++j)
        {   
            int tt = dp[i - 1][(j - t + k) % k];
            if (tt != -1)
                dp[i][j] = max(dp[i][j], tt + arr[i]);
        }
    }
    cout << dp[n - 1][0];
}
// 64 位输出请用 printf("%lld")