/*
18:55
수영장 이용
13분 컷
1일 이용권
1달 이용권
3달 이용권
1년 이용권
가장 적은 비용으로 수영장을 이용할 수 있는 방법을 찾고 그 비용을 정답으로 출력
dfs 로 풀고, 1,2,3, 을 사용하지 않는 방법을 해보도록 합니다.
*/
#include <iostream>
#include <algorithm>
#include <memory.h>
using namespace std;
int price[4];
int month[13];
int minVal = 2123456789;
void problemIn() {
for (int i = 0; i < 4; i++) {
cin >> price[i];
}
for (int i = 1; i < 13; i++) {
cin >> month[i];
}
}
void init() {
minVal = 2123456789;
}
void dfs(int depth, int sum) {
if (depth >= 13) {
minVal = min(minVal, sum);
return;
}
if (month[depth] > 0) {
dfs(depth + 1, sum + price[0] * month[depth]); // 1일 이용권
dfs(depth + 1, sum + price[1]); // 한달 이용권
dfs(depth + 3, sum + price[2]); // 세달 이용권
dfs(depth + 12, sum + price[3]); // 1년 이용권
}
else {
dfs(depth + 1, sum);
}
}
void solve() {
dfs(1, 0);
}
int main() {
int T;
cin >> T;
for (int tc = 1; tc <= T; tc++) {
problemIn();
solve();
cout << "#" << tc << " " << minVal << endl;
init();
}
return 0;
}