题意是给你一个数,然后你有0.25,0.1,0.05,0.01的四种面额若干,让你求出最小的钱币纸张。
思路:
对于这种题目要自己观察两样东西,一个是四种面额之间的关系,两一个就是数据范围,这个题目虽然说每个面额最多100张,但是自己算算根本不会全都达到这个数目,最大的总金额是5元=20*0.25=50*0.1,说到这懂了吧,直接暴力就行了,对于这样的题目,如果总金额不是5元,是更大的数怎么办呢?之前见过一个暴力过不去的,但是他给的四个货币是 10 5 1 0.1 这四个,前面的是后面的任意一个的整数倍,这样的我们可以直接贪心去弄,如果是求最小就从大到小,能用就用,如果是求最多货币,那么还是从大到小,能不用就不用。
#include<stdio.h> int main () { int a ,b ,c ,d ,aa ,bb ,cc ,dd ,min; double num; while(~scanf("%lf %d %d %d %d" ,&num ,&a ,&b ,&c ,&d)) { int t = int(num / 0.25 + 1); if(a > t) a = t; t = int(num/0.1 + 1); if(b > t) b = t; aa = bb = cc = dd = -1; min = 1000000000; for(int i = 0 ;i <= d && aa == -1;i ++) for(int j = 0 ;j <= c && aa == -1;j ++) for(int k = 0 ;k <= b && aa == -1;k ++) for(int w = 0 ;w <= a && aa == -1;w ++) { if(i * 0.01 + j * 0.05 + k * 0.1 + w * 0.25 == num) { if(min > i + j + k + w) { min = i + j + k + w; aa = w ,bb = k ,cc = j ,dd = i; } } } aa == -1 ? puts("NO EXACT CHANGE"):printf("%d %d %d %d " ,aa ,bb ,cc ,dd); } return 0; }