HDU 3348 coins 贪心

该题分别给出面值为1,5,10,50,100的纸币数,求出,表示一个值的最少所需的纸币数,最多所需的纸币数。

先贪心出最少的情况,怎样取得最小的,我们每次取币值最大,跟价钱比较,如果价钱大于币值,我们一定用币值大的,下面取得最小的,我们因该从刚满足我们价钱的最大的币值开始取,那么我们每次下去一定取得的数目是最大的,

#include<stdio.h>

#include<stdlib.h>

#include<string.h>

int minnumber( int a[], int num[], int price, int sum[] )

{

    int ans=0;

    for( int i=5;i>1; i-- )

    {

           if( price>=num[i]*a[i] )// 取币值最大的 

           {

               ans+=num[i];

               price-=num[i]*a[i];   

           }     

           else 

           {

              ans+=price/a[i];

              price%=a[i];     

           }    

    }

    if( price<=num[1] )

     return ans+price;

    return -1;    

}

int maxnumber( int a[],int num[], int price, int sum[] )

{

    int ans=0;

    for( int i=5; i>1; i-- )

    {

        if( price<=sum[ i -1 ] )//取币值最小的 

          continue;

        else

        {

            int t=( price - sum[i-1] )/a[i]+(( ( price - sum[ i-1 ] )%a[i] )? 1 : 0);

            ans+=t;

            price=price-t*a[i];

       }     

    }

    

    if( price> num[1] )

      return -1;

     return ans+price;    

}

void DP( int a[], int num[], int price )

{

     int sum[6]={0};

     sum[1]=num[1];

     for( int i=2; i<=5 ;i++ )

     {

         sum[i]=sum[i-1]+a[i]*num[i];

     }

     int min=minnumber( a, num,price,sum );

     if( min==-1 )

       printf( "-1 -1\n" );

     else 

     {

        int max=maxnumber( a, num , price , sum );

        if( max!=-1 )

        printf( "%d %d\n",min, max );

        else printf( "-1 -1\n" );     

     }     

}

int  main()

{

   int num[6],price,n,a[6]={0,1,5,10,50,100};

   scanf( "%d",&n );

   for( int i=1; i<=n; i++ )

   {

        int sum=0;

        scanf( "%d",&price );

        for( int j=1; j<6;j++ )

        {

           scanf( "%d",&num[j] );

           sum+=a[j]*num[j];

        }

        if( sum>=price )

        DP( a,num ,price);

        else printf( "-1 -1\n" );     

   }

   return 0;     

}

  

你可能感兴趣的:(HDU)