动态规划
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; }
浙公网安备 33010602011771号