#include<iostream>
#include<cstdio>
#include<memory.h>
using namespace std;
#define min(a,b) (a)<(b)?(a):(b)
#define INF 0x3f3f3f3f
#define N 55
#define M 220
int k,n,T,M1,M2,a,b;
int t[N];
int f[M][N];
bool trn[M][N][2];
int main(){
for(;~scanf("%d",&n) && n;){
k++;
memset(t,0,sizeof(t));
memset(trn,0,sizeof(trn));
scanf("%d",&T);
for(int i=1;i<n;i++)
scanf("%d",&t[i]);
scanf("%d",&M1);
for(int i=1;i<=M1;i++){
scanf("%d",&a);
for(int j=1;j<=n;j++){
trn[a][j][0]=1;
a+=t[j];
}
}
scanf("%d",&M2);
for(int i=1;i<=M2;i++){
scanf("%d",&b);
for(int j=n;j>=1;j--){
trn[b][j][1]=1;
b+=t[j-1];
}
}
for(int i=1;i<n;i++)
f[T][i]=INF;
f[T][n]=0;
for(int i=T-1;i>=0;i--)
for(int j=1;j<=n;j++){
f[i][j]=f[i+1][j]+1;
if(j<n && trn[i][j][0] && i+t[j]<=T)
f[i][j]=min(f[i][j],f[i+t[j]][j+1]);
if(j>1 && trn[i][j][1] && i+t[j-1]<=T)
f[i][j]=min(f[i][j],f[i+t[j-1]][j-1]);
}
printf("Case Number %d: ",k);
if(f[0][1]>=INF)
printf("impossible\n");
else printf("%d\n",f[0][1]);
}
return 0;
}
/*
4
55
5 10 15
4
0 5 10 20
4
0 5 10 15
4
18
1 2 3
5
0 3 6 10 12
6
0 3 5 7 12 15
2
30
20
1
20
7
1 3 5 7 11 13 17
0
*/
原文地址:https://www.cnblogs.com/pelom/p/10455601.html
时间: 2024-10-03 23:58:29