ACM第一次练习—1005F

题意:输入需要的钱数,手里的钱:1角,5角,1元,5元,10元(都以角为单位输入),输出凑齐需要的钱数最少需要几张纸币,最多需要几张纸币,如果手中的钱凑不齐,输出“-1 -1”.

思路:1.最少数贪心策略:优先取面值大的纸币来凑需要的钱。最大数策略:要花最多输纸币,则留在手中的的纸币要最少,假设手上有P角,价格为q角,用手上最少的纸币去凑(p-q),然后用手中的总数减去该最少数就可以了。

感想:数组的使用还存在问题,数组作为函数参数是怎么用还不会!!!通过这个题补回来了~

代码:

#include <iostream>
#include "stdio.h"
#include "string.h"


int b[10]={0,1,5,10,50,100};
int main()
{
    int t;
    int p,r;
    int a[10],c[10],e[10];
    int i,j,k,sum;


    scanf("%d",&t);
    while(t--)
    {
        sum=0;
        scanf("%d",&p);
        r=p;
        for(i=1;i<=5;i++)
        {
            scanf("%d",&a[i]);
            sum=sum+b[i]*a[i];
        }
        for(i=5;i>0;i--)
        {
            if(r/b[i]<a[i])
            {
                c[i]=r/b[i];
                r=r-b[i]*c[i];
            }
            else
            {
                c[i]=a[i];
                r=r-c[i]*b[i];
            }
        }
        if(r!=0)
        {
            printf("-1 -1\n");
        }else
        {
            k=sum-p;
            for(i=5;i>0;i--)
            {
                if(k/b[i]<a[i])
                {
                    e[i]=k/b[i];
                    k=k-b[i]*e[i];
                }
                else
                {
                    e[i]=a[i];
                    k=k-e[i]*b[i];
                }
            }
            if(k==0)
            {
                printf("%d %d\n",c[1]+c[2]+c[3]+c[4]+c[5],(a[1]+a[2]+a[3]+a[4]+a[5]-(e[1]+e[2]+e[3]+e[4]+e[5])));
            }
            
        }    


    }
}


你可能感兴趣的:(ACM第一次练习—1005F)