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;     
}

  

posted @ 2011-08-12 16:26  wutaoKeen  阅读(655)  评论(0)    收藏  举报