https://www.acwing.com/problem/content/1049/‘
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 110;
typedef long long LL;
int a[N];
int f[N][N]; // 表示的是从前 i 件物品中选 , sum % k 的余数是 j 的糖果的总数
int main()
{
int n , k;
cin >> n >> k;
for(int i = 1; i <= n ; i ++) cin >> a[i];
// 初始化不用说
memset(f , -0x3f , sizeof f);
f[0][0] = 0;
for(int i = 1 ; i <= n ; i ++)
for (int j = 0 ; j < k ; j ++)
{
f[i][j] = max(f[i - 1][j], f[i - 1][(j + k - a[i] % k) % k] + a[i]);
// 要说的是这个地方就是 , 我们第二位枚举的是余数 , 一定不能超过 k 的 所以是 0 - k - 1
// 其次 我们需要知道 j - a[i] 是否是 < 0 的 , 我们不知道所以需要我们转换一下
// 就是将 j - a[i] 转换 到 > 0 < k 所以需要先将 a[i] % k 这样就把 a[i] 转换为 0 - k - 1之间了
// 那么 j - (0 - k - 1) + k 一定是 > 0 的 , j - k + 1 + k = j + 1 > 0 所以成立
}
printf("%d" , f[n][0]);
return 0;
}