动态规划

dp数组,dp[i][j]表示前i个数中除以k的余数为j的当前最大和

 

如果前一个状态余数为j,则更新当前余数为(j+arr[i])%k的情况,要么从余数为j的状态转化过来,
                要么前一个状态余数也是(j+arr[i])%k,即不选择当前元素*/
dp[i][(int)((j+arr[i])%k)]=Math.max(dp[i-1][j]+arr[i],dp[i-1][(int)((j+arr[i])%k)]);
            

 

#include <iostream>
#include <vector>
#include <algorithm>
#include <climits>
#include <cstring>
using namespace std;

int main() {
    int n, k;
    cin >> n >> k;
    vector<long long> num(n+1, 0);
    for (int i = 1; i <= n; i++) {
        cin >> num[i];
    }

    vector<vector<long long>> dp(n+1, vector<long long>(k,  LLONG_MIN));
    dp[0][0] = 0;

    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < k; j++) {
             dp[i][(j + num[i]) % k] = max(dp[i-1][(j + num[i]) % k], dp[i - 1][j] + num[i]);
        }
    }


    if (dp[n][0] <= 0) {
        cout << -1 << endl;
    } else {
        cout << dp[n][0] << endl;
    }

    return 0;

}

 

posted @ 2025-06-16 11:53  最近饭吃的很多  阅读(9)  评论(0)    收藏  举报