您的位置:首页 > 其它

HDU 3348 coins 贪心

2011-08-12 16:26 357 查看
该题分别给出面值为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;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: