10626 - Buying Coke
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 */