coins HDU - 3348
考察:贪心
思路:
最小数量很好求,从大到小贪心即可.关键是最大数量.我们要考虑全部取最小的剩下的还能否被表示的问题.直接取很难求,至少本蒟蒻没想出来怎么求.
我们求出C的最小数量后,可以发现剩下的是表示总钱数sum-C的最大数量.根据此我们可以求出sum-C的最小数量,剩下的就是最大数量
注意: 不要用C%5当作用去的1元币,如果其他钱数不够只能用一元币答案就会错误.
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int N = 6; 7 typedef pair<int,int> PII; 8 PII p[N]; 9 int money[6] = {0,1,5,10,50,100}; 10 int solve(int C) 11 { 12 int sum = C,ans =0; 13 for(int i=5;i>=1;i--) 14 { 15 int t = sum/p[i].first,k = p[i].second; 16 sum-=min(t,k)*p[i].first; 17 ans+=min(t,k); 18 } 19 if(sum>0) return -1; 20 else return ans; 21 } 22 int main() 23 { 24 int T; 25 scanf("%d",&T); 26 while(T--) 27 { 28 int C,sum = 0,sum2 = 0; 29 scanf("%d",&C); 30 for(int i=1;i<=5;i++) 31 { 32 scanf("%d",&p[i].second); 33 p[i].first = money[i]; 34 sum+=p[i].first*p[i].second; 35 sum2+=p[i].second; 36 } 37 int ans = solve(C); 38 if(ans!=-1) 39 { 40 for(int ) 41 }else printf("-1 -1\n"); 42 } 43 return 0; 44 }