#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define IT(c) typeof((c).begin()) #define For(i, a, b) for(int (i) = int(a); i < int(b); ++i) #define rep(x, n) For(x,0,n) #define foreach(i, c) for(IT(c) i = (c).begin(); i != (c).end(); ++i) #define sz(a) int((a).size()) #define pb push_back #define mp make_pair #define F first #define S second typedef vector Vi; typedef vector > Vvi; typedef vector Vs; typedef pair Pi; #define setmin(a,b) a = min(a,b) typedef long long ll; ll walk_cost, fuel_cost, parking_cost, truck_cap; #define N 52 ll A[N]; ll m[N][N][N][2]; ll n; int main(){ while(1){ cin>>n; if(n==0) break; A[0] = 0; rep(i,n) cin>>A[i+1]; sort(&A[0], &A[n+1]); n++; cin>>walk_cost>>fuel_cost>>parking_cost>>truck_cap; truck_cap = min(truck_cap, n-1); #define PACK(a,b,c,d ) mp(mp(a,b), mp(c, d)) typedef pair, pair > State; memset(m, 0x3f, sizeof(m)); priority_queue > pq; m[0][truck_cap][0][1] = 0; pq.push(mp(-0, PACK(0, truck_cap,0, 1))); while(!pq.empty()){ pair top = pq.top(); ll at = -top.F; State state = top.S; pq.pop(); ll truck = state.F.F, pack = state.F.S, last = state.S.F; ll park = state.S.S; if(at > m[truck][pack][last][park]) continue; //cout< 0 && park) NEW(truck, pack - 1,last+1, 1, at + abs(A[truck] - A[last+1])*walk_cost); if(truck > 0){ int to = truck - 1; ll move = abs(A[truck] - A[to])*fuel_cost; NEW(to, pack ,last, 0, at + move ); } if(truck + 1 < n){ int to = truck + 1; ll move = abs(A[truck] - A[to])*fuel_cost; NEW(to, pack ,last, 0, at + move ); } } ll res = 1000000000000000000LL; rep(i, N) rep(k, N) rep(j, 2) res = min(res, m[i][k][n-1][j]); cout<