2016sdau课程练习专题一 1005 problemF

本文介绍了一个关于纸币组合的问题,需要使用最少或最多的纸币数量凑出特定总价。通过贪心算法实现,先从最大面额开始计算最少纸币数量,再通过剩余金额计算最多纸币数量。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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;


}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值