概述:给定一个书的价格和各种面值的纸币个数,求买这本书需要的最小纸币数和最大纸币数。
思路:最小数的求解思路是从面值大的开始贪心,直到花完钱为止,最大值运用转换思维,转化为总钱数减去书钱,求这些钱的最小值,即为所需纸币的最大值。
感想: 以后要多学学转换思维。
#include<iostream>
#include<cstring>
#include<fstream>
#include<numeric>
using namespace std;
const int coin[5]={1,5,10,50,100};
int rest[5];
int Minmum(int money)
{
int restCoin[5];
for(int i=0;i<5;++i)
restCoin[i]=rest[i];
int ans=0;
for(int i=4;i>=0;--i)
{
if(money<=0) break;
if(money<coin[i])
continue;
while(restCoin[i])
{
if(money-coin[i]<0)
break;
--restCoin[i];
money-=coin[i];
++ans;
}
}
if(money==0) return ans;
else return -1;
}
int main()
{
//ifstream cin("aaa.txt");
int n,allcost;
cin>>n;
while(n--)
{
memset(rest,0,sizeof(rest));
cin>>allcost;
for(int i=0;i<5;++i)
cin>>rest[i];
int sum=accumulate(rest,rest+5,0);
int allMoney=0;
for(int i=0;i<5;++i)
allMoney+=rest[i]*coin[i];
int MinCost=Minmum(allcost),MaxCost=sum-Minmum(allMoney-allcost);
if(MinCost==-1||MaxCost==-1)
cout<<"-1 -1"<<endl;
else
cout<<MinCost<<" "<<MaxCost<<endl;
}
return 0;
}
3287

被折叠的 条评论
为什么被折叠?



