1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| #include <iostream> #include <algorithm> #include <vector> #define N 40
using namespace std;
int n, m; int w[N]; vector<int> A, B;
void dfs(int u, int k, int sum, vector<int>& vec) { if (u == k) { vec.push_back(sum % m); return; } dfs(u + 1, k, sum + w[u], vec); dfs(u + 1, k, sum, vec); }
int main() { cin >> n >> m;
for (int i = 0; i < n; ++ i) cin >> w[i];
dfs(0, n / 2, 0, A); dfs(n / 2, n, 0, B);
sort(A.begin(), A.end()); sort(B.begin(), B.end());
int res = (A.back() + B.back()) % m;
for (int i = 0, j = B.size() - 1; i < A.size() && ~j; ++ i) { while (~j && A[i] + B[j] >= m) -- j; if (~j) res = max(res, (A[i] + B[j]) % m); }
cout << res << endl;
return 0; }
|