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 */

 

posted @ 2015-10-28 22:10  Ember  阅读(245)  评论(0编辑  收藏  举报