代码:
#include<iostream>
#include<fstream>
#include<queue>
using namespace std;
struct e{
int data;
int cost;
e *next;
};
e edge[25];
int n,m;
int r[25],num[25];
void add(int s,int t,int w){
e *p=new e;
p->data=t;
p->cost=w;
p->next=edge[s].next;
edge[s].next=p;
}
int v[25];
int ans;
int d[25];
int cnt[25];
int solve(){
int i,j,k;
memset(d,-1,sizeof(d));
memset(cnt,0,sizeof(cnt));
memset(v,0,sizeof(v));
queue<int> q;
q.push(0);
v[0]=1;
cnt[0]=1;
d[0]=0;
while(!q.empty())
{
i=q.front();
v[i]=0;
q.pop();
e *p=edge[i].next;
while(p)
{
if(d[p->data]<d[i]+p->cost)
{
d[p->data]=d[i]+p->cost;
if(v[p->data]==0)
{
cnt[p->data]++;
if(cnt[p->data]>24)
return 0;
v[p->data]=1;
q.push(p->data);
}
}
p=p->next;
}
}
if(d[24]==ans)
return 1;
return 0;
}
void read(){
// ifstream cin("in.txt");
int i,j,k;
int cas;
cin>>cas;
// scanf("%d",&cas);
while(cas--)
{
memset(num,0,sizeof(num));
for(i=1;i<=24;i++)
cin>>r[i];
// scanf("%d",&r[i]);
cin>>n;
// scanf("%d",&n);
for(i=1;i<=n;i++)
{
cin>>j;
// scanf("%d",&j);
num[j+1]++;
}
for(ans=0;ans<=n;ans++)
{
for(i=0;i<=24;i++)
edge[i].next=0;
for(i=1;i<=24;i++)
add(i-1,i,0);
for(i=1;i<=24;i++)
add(i,i-1,-num[i]);
for(i=8;i<=24;i++)
add(i-8,i,r[i]);
for(i=1;i<=7;i++)
add(i+16,i,r[i]-ans);
add(0,24,ans);
if(solve())
{
cout<<ans<<endl;
break;
}
}
if(ans>n) cout<<"No Solution"<<endl;
}
}
int main(){
read();
return 0;
}