/* -*- coding: utf-8 -*- * * 3670.cc: No.3670 Fast Knapsack - yukicoder */ #include #include #include using namespace std; /* constant */ const int MAX_N = 100000; const int MAX_S = 200000; /* typedef */ struct Mybitset { using ull = unsigned long long; int l; vector bs; Mybitset(int _s): l((_s + 64 - 1) / 64), bs(l + 1, 0) {} void print() const { for (int i = l - 1; i >= 0; i--) for (int j = 63; j >= 0; j--) putchar('0' + ((bs[i] >> j) & 1)); putchar('\n'); } void set(int x) { bs[x / 64] |= (1ULL << (x & 63)); } Mybitset &shitor(int x) { int xq = x / 64, xr = x & 63; for (int i = l - 1 - xq; i >= 0; i--) { ull b0 = (bs[i] << xr), b1 = (bs[i] >> (64 - xr)); bs[i + xq] |= b0, bs[i + xq + 1] |= b1; } //print(); return *this; } int msb(int s) const { int q = s / 64, r = s & 63; while (s >= 0) { if (bs[q] == 0) q--, r = 63, s = q * 64 + r; else { if ((bs[q] >> r) & 1) return s; if (--r < 0) r = 63, q--; s--; } } return -1; } }; /* global variables */ int as[MAX_N]; /* subroutines */ /* main */ int main() { int tn; scanf("%d", &tn); while (tn--) { int n, s; scanf("%d%d", &n, &s); for (int i = 0; i < n; i++) scanf("%d", as + i); Mybitset dp(s + 1); dp.set(0); for (int i = 0; i < n; i++) dp.shitor(as[i]); int maxs = dp.msb(s); printf("%d\n", maxs); } return 0; }