RT,没过样例
#include<cstdio>
#include<cstring>
#include<queue>
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
int n,k,m,dis[25][25],cf[10010],a[10010],cnt=-1,loc[10010],w[10010],f[(1<<20)+10];
void bfs(int s){
memset(w,0,sizeof(w));
for(int i=1;i<=n+1;i++)
w[i]=0x3f3f3f3f;
queue<int>q;
q.push(s);w[0]=0;
while(!q.empty()){
int x=q.front();
q.pop();
for(int i=1;i<=m;i++){
int pre=x-a[i],nxt=x+a[i];
if(pre>0&&w[pre]==0x3f3f3f3f)
w[pre]=w[x]+1,q.push(pre);
if(nxt<=n+1&&w[nxt]==0x3f3f3f3f)
w[nxt]=w[x]+1,q.push(nxt);
}
}
for(int i=1;i<=n+1;i++)
if(loc[i]>=0)
dis[loc[s]][loc[i]]=w[i];
}
int main(){
scanf("%d%d%d",&n,&k,&m);
for(int i=1;i<=k;i++){
int x;
scanf("%d",&x);
cf[x]=1;
}
for(int i=1;i<=m;i++)
scanf("%d",&a[i]);
for(int i=n+1;i;i--)
cf[i]^=cf[i-1];
memset(loc,-1,sizeof(loc));
for(int i=1;i<=n+1;i++)
if(cf[i])loc[i]=++cnt;
cnt++;
for(int i=1;i<=n+1;i++)
if(cf[i])bfs(i);
for(int i=1;i<(1<<cnt);i++)f[i]=0x3f3f3f3f;
for(int i=0;i<(1<<cnt);i++){
if(f[i]==0x3f3f3f3f)
continue;
for(int j=0;j<cnt;j++){
if((i>>j)&1)continue;
for(int k=j+1;k<cnt;k++)
if(!((i>>k)&1))f[i+(1<<j)+(1<<k)]=min(f[i+(1<<j)+(1<<k)],f[i]+dis[j][k]);
}
}
printf("%d",f[(1<<cnt)-1]==0x3f3f3f3f?-1:f[(1<<cnt)-1]);
return 0;
}