1.题目编号
1005 problemF
2.简单题意
给你一个总价格,还有面值分别为1,5,10,50,100(单位:毛)纸币的数量,要你用最少数量的纸币和最多数量的纸币凑出这个价格,输出最少和最多的数量。
3.思路
求最少的硬币数时,直接从最大的开始检索,排序,如果需要的钱数大于最大的钱数, 那么就把最大的这个都放上,再继续加入下一个较小的硬币。
求最多的硬币数时, 我们可以用总的钱数减去要找的钱数,那么就是手里还剩的钱数,总的硬币数是一样的,要使找出去的钱最多,可以让自己手里剩的钱最少。
4.感想
好麻烦,要使用贪心算法来解决,真难做,真醉了
5.代码
#include<iostream>
int min(int a[],int n[],int p,int s[])
{
int i;
int ans=0;
for(i=5;i>1;i--)
{
if(p>=n[i]*a[i])
{
ans+=n[i];
p-=n[i]*a[i];
}
else
{
ans+=p/a[i];
p%=a[i];
}
}
if(p>n[1])return -1;
else return ans+p;
}
int max(int a[],int n[],int p,int s[])
{
int i;
int ans=0;
for(i=5;i>1;i--)
{
if(p<=s[i-1])continue;
else
{
int t;
t=((p-s[i-1])/a[i])+(((p-s[i-1])%a[i])?1:0);
ans+=t;
p-=t*a[i];
}
}
if(p>n[1])return -1;
else return ans+p;
}
void X(int a[],int num[],int p)
{
int i;
int sum[6]={0};
sum[1]=num[1];
for(i=2;i<=5;i++)
sum[i]=sum[i-1]+a[i]*num[i];
int j,k;
j=min(a,num,p,sum);
if(j==-1)printf("-1 -1\n");
else
{
k=max(a,num,p,sum);
if(k==-1)printf("-1 -1\n");
else
printf("%d %d\n",j,k);
}
}
int main()
{
int a[6]={0,1,5,10,50,100};
int i,p;
int num[6];
int T;
scanf("%d",&T);
while(T--)
{
int sum;
sum=0;
scanf("%d",&p);
for(i=1;i<6;i++)
{
scanf("%d",&num[i]);
sum+=num[i]*a[i];
}
if(sum<p)printf("-1 -1\n");
else X(a,num,p);
}
return 0;
}