1 /*
2 题意:
3 就是说有1,5,10三种硬币,要在自动售货机买可乐,单价8,
4 一次只能买一瓶,然后售货机找零,然后拿着剩下的钱再买,
5 给出要买的可乐的数量还有1,5,10三种货币的数量,问至少要给多少硬币。
6 例如,2 2 1 1,要买2瓶可乐,先给一次10块,剩下1,5,10的硬币 4 1 0 枚,
7 再给一个5,3个1, 所以总共要给 5个硬币
8
9 */
10 #include<cstdio>
11 #include<cstring>
12 #include<algorithm>
13 #define INF 0x3f3f3f3f
14 using namespace std;
15 int c,n1,n5,n10;
16 int dp[850][250][150];
17 int dfs(int o,int f,int t,int cnt)
18 {
19 if(o*1+f*5+t*10 < 8) return 0;
20 if(cnt == c) return 0;
21 if(dp[o][f][t] != INF) return dp[o][f][t];
22
23 if(t >= 1)
24 dp[o][f][t]= min( dp[o][f][t] , dfs(o+2,f,t-1,cnt+1)+1);
25 if(f >= 2)
26 dp[o][f][t] = min( dp[o][f][t] , dfs(o+2,f-2,t,cnt+1)+2);
27 if(f >= 1 && o >= 3)
28 dp[o][f][t] = min(dp[o][f][t], dfs(o-3,f-1,t,cnt+1)+4);
29 if(o>=3 && t>=1 )
30 dp[o][f][t] = min(dp[o][f][t], dfs(o-3,f+1,t-1,cnt+1)+4);
31 if(o >=8)
32 dp[o][f][t] = min(dp[o][f][t], dfs(o-8,f,t,cnt+1) + 8 ) ;
33 return dp[o][f][t];
34 }
35 int main()
36 {
37 int t;
38 scanf("%d",&t);
39 while(t--)
40 {
41 scanf("%d%d%d%d",&c,&n1,&n5,&n10);
42 memset(dp,INF,sizeof(dp));
43 dp[0][0][0]=0;
44 dfs(n1,n5,n10,0);
45 printf("%d\n",dp[n1][n5][n10]);
46 }
47 return 0;
48 }
49
50 /*
51 #include<cstdio>
52 #include<cstring>
53 #include<algorithm>
54 #define INF 0x3f3f3f3f
55 using namespace std;
56 int c,n1,n5,n10;
57 int dp[800][200][100];
58 int dfs(int o,int f,int t,int cnt)
59 {
60 if(o*1+f*5+t*10 < 8) return 0;
61 if(cnt == 0) return 0;
62 if(dp[o][f][t] != -1) return dp[o][f][t];
63
64 dp[o][f][t] = INF;
65 if(t >= 1)
66 dp[o][f][t]= min( dp[o][f][t] , dfs(o+2,f,t-1,cnt-1)+1);
67 if(f >= 2)
68 dp[o][f][t] = min( dp[o][f][t] , dfs(o+2,f-2,t,cnt-1)+2);
69 if(f >= 1 && o >= 3)
70 dp[o][f][t] = min(dp[o][f][t], dfs(o-3,f-1,t,cnt-1)+4);
71 if(o>=3 && t>=1 )
72 dp[o][f][t] = min(dp[o][f][t], dfs(o-3,f+1,t-1,cnt-1)+4);
73 if(o >=8)
74 dp[o][f][t] = min(dp[o][f][t], dfs(o-8,f,t,cnt-1) + 8 ) ;
75 return dp[o][f][t];
76 }
77 int main()
78 {
79 int t;
80 scanf("%d",&t);
81 while(t--)
82 {
83 scanf("%d%d%d%d",&c,&n1,&n5,&n10);
84 memset(dp,-1,sizeof(dp));
85 dp[0][0][0]=0;
86 dfs(n1,n5,n10,c);
87 printf("%d\n",dp[n1][n5][n10]);
88 }
89 return 0;
90 }
91
92 */