Description:
Accept:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e3 + 10;
const double inf = 1e20;
const double eps = 1e-8;
struct Simplex
{
vector<double> b, c;
vector<vector<double> >a;
double z;
int n, m;
void Init(int n_, int m_)
{
n = n_, m = m_;
b.resize(m);
a.resize(m);
c.resize(n);
for(auto &x : a) x.resize(n + 1), fill(x.begin(), x.end(), 0);
std::fill(b.begin(), b.end(), 0);
std::fill(c.begin(), c.end(), 0);
z = 0;
}
void Pivot(int k, int l)
{
b[l] /= a[l][k];
for(int j = 0; j < n; j ++)
if(j != k) a[l][j] /= a[l][k];
for(int i = 0; i < m; i ++)
{
if(i != l && fabs(a[i][k]) > eps)
{
b[i] -= a[i][k] * b[l];
for(int j = 0; j < n; j ++)
if(j != k) a[i][j] -= a[i][k] * a[l][j];
a[i][k] /= -a[l][k];
}
}
z += c[k] * b[l];
for(int j = 0; j < n; j ++)
if(j != k) c[j] -= c[k] * a[l][j];
c[k] /= -a[l][k];
a[l][k] = 1 / a[l][k];
}
double Solve()
{
while(true)
{
int k = 0, l = 0;
double minc = inf;
for(int i = 0; i < n; i ++)
if(c[i] < minc)
minc = c[k = i];
if(minc > -eps) return z;
double minba = inf;
for(int i = 0; i < m; i ++)
if(a[i][k] > eps && minba - b[i] / a[i][k] > eps)
minba = b[i] / a[i][k], l = i;
if(minba == inf) return inf;
Pivot(k, l);
}
}
};
int n, m;
const int nlimit = 24;
Simplex spx;
int main()
{
int t, tm;
for(scanf("%d", &t); t --;)
{
spx.Init(nlimit << 1, nlimit);
for(int i = 0; i < nlimit; i ++)
scanf("%lf", &spx.c[i]), spx.c[i] = -spx.c[i];
scanf("%d", &n);
for(int i = 0; i < n; i ++)
{
scanf("%d", &tm);
spx.c[nlimit + tm % nlimit] ++;
}
for(int i = 0; i < nlimit; i ++)
{
for(int j = i; j < i + 8; j ++)
spx.a[i][j % nlimit] = 1;
spx.a[i][nlimit + i] = -1;
spx.b[i] = 1;
}
double ans = spx.Solve();
if(ans == inf) printf("No Solution\n");
else printf("%d\n", (int)(-ans + 0.5));
}
return 0;
}