最少硬币问题
题目描述
设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。
输入
输入的第一行中只有1 个整数给出n的值,第2 行起每行2 个数,分别是T[j]和Coins[j]。最后1 行是要找的钱数m。
输出
程序运行结束时,将计算出的最少硬币数输出。问题无解时输出-1。
main()
{
int T[100],Coins[100],m,n,i,j,t,s=0;
while(~scanf("%d",&n))//多组输入
{
s=0;
for(i=0; i<n; i++)//输入数据
{
scanf("%d ",&T[i]);
scanf("%d\n",&Coins[i]);
}
scanf("%d",&m);
for(i=0; i<n-1; i++)//将数据排序,先找大的钱币
for(j=i+1; j<n; j++)
if(T[i]<T[j])
{
t=T[i];
T[i]=T[j];
T[j]=t;
t=Coins[i];
Coins[i]=Coins[j];
Coins[j]=t;
}
/* for(i=0;i<n;i++)
printf("%d %d\n",T[i],Coins[i]);*/
{
for(i=0; i<n; i++)
for(j=0; j<Coins[i]; j++)//利用循环,依次找钱
if(m>=T[i])
{
m=m-T[i];
s++;
}
else
break;
}
if(m==0)//判断是否为0,如为0,则有方法能够成功找钱
printf("%d\n",s);
else
printf("%d\n",-1);
}
}