hdu1353 小暴力

题意:
      题意是给你一个数,然后你有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;
}
                

原文地址:https://www.cnblogs.com/csnd/p/12062834.html