倍数问题 - 蓝桥云课 (lanqiao.cn)
给定n个数找到三个 数满足和是k的倍数,求出这三个的和
将背包容量取在0~k-1之间
#include <iostream>
#include <bits/stdc++.h>
#include <cstring>
#include <vector>
#include <algorithm>
#define x first
#define y second
#define fu(i,a,b) for(int i=a;i<=b;i ++ )
#define fd(i,a,b) for(int i=a;i>=b;i -- )
#define endl '\n'
#define ms(x,y) memset(x,y,sizeof x)
#define ios ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
typedef pair<double,double> PDD;
typedef pair<double,int> PDI;
typedef pair<char,int> PCI;
typedef pair<string,int> PSI;
typedef pair<int,string> PIS;
typedef pair<LL,LL> PLL;
//typedef __int128 i128;
typedef unsigned long long ULL;
const int N = 1e5+ 10,M = 1e5 + 10,INF = 0x3f3f3f3f ;
const int mod = 1e9;
const double eps = 1e-8;
int n,m,f[4][N];
vector<int> a[N];
inline void solve()
{
cin >> n >> m;
fu(i,1,n)
{
int t ;cin >> t;
a[t % m].push_back(t);
}
ms(f,-0x3f);
f[0][0] = 0;
fu(i,0,m-1)
{
sort(a[i].begin(),a[i].end(),greater<int>());
for(int u = 0; u < 3 && u < a[i].size();u ++ )
{
int t = a[i][u];
fd(j,3,1)
fu(k,0,m-1)
f[j][k] = max(f[j][k],f[j-1][(k-t % m + m) % m ] + t);
}
}
// 当前选了 3 个数 模 k的余数为0的 的总和
cout << f[3][0] << endl;
}
signed main()
{
// freopen("1.txt","w",stdout);
ios
int t=1;
// cin>>t;
int now = 1;
while(t -- )
{
// cout<<"Case ";
// cout<<"Case #";
// cout<< now ++ <<": ";
solve();
}
return 0;
}