题意
给1,5,10,50,100面值的钞票个a张,求得到p的最小张数和最大张数,
不能则输出-1.
样例
Sample Input
3
33 6 6 6 6 6
10 10 10 10 10 10
11 0 1 20 20 20
Sample Output
6 9
1 10
-1 -1
AC代码
#include <iostream>
#include<algorithm>
using namespace std;
int value[5]={1,5,10,50,100};
int mixcoin(long long money,long long count[])
{
long long ans=0;
for(int i=4;i>=0;i--)
{
long long c=min(money/value[i],count[i]);
money-=c*value[i];
ans+=c;
}
if (money>0)
return -1;
else
return ans;
}
/*
int maxcoin(int money,int count[])
{
int sum=0;
for(int i=0;i<5;i++)
{
int c=min(money/value[i],count[i]);
money-=c*value[i];
if(i<4)
{
if(money%value[i+1]!=0)
{
money+=c*value[i];
for(int j=count[i];j>0;j--)
//这里的j不能位0,如果为0,则会发生除0错误
{
if(money%(j*value[i])==0)
{
c=j;
money-=c*value[i];
break;
}
}
}
}
sum+=c;
}
if (money>0)
return -1;
else
return sum;
}
*/
int main()
{
long long n,money,count[1001];
cin>>n;
for(int i=0;i<n;i++)
{
long long summoney=0,sumcount=0;
cin>>money; //支付的钱数
for(int j=0;j<5;j++)
{
cin>>count[j];
summoney+=count[j]*value[j]; //所拥有的钱的总数
sumcount+=count[j]; //纸币总数量
}
if(summoney<money)
{
cout<<"-1 -1"<<endl;
continue; //这里是continue,不是return 0
}
cout<<mixcoin(money,count)<<" "; //所花费的最小数量的纸币
//计算最大数量就是(纸币总数量)减去(所拥有的钱的总数减去支付的钱数)所花费的最小数量的纸币。
if(mixcoin(summoney-money,count)!=-1)
cout<<sumcount-mixcoin(summoney-money,count)<<endl;
else
cout<<"-1"<<endl;
}
return 0;
}
题源:acm.hdu.edu.cn/showproblem…