1221-最少硬币问题
描述
设有n种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。
对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,以及钱数m,0≤m≤20001,编程计算找钱m的最少硬币数。
输入
输入的第一行中只有1个整数给出n的值,第2行起每行2个数,分别是T[j]和Coins[j]。最后1 行是要找的钱数m。
输出
输出计算的最少硬币数,问题无解时输出-1。
样例输入
3
1 3
2 3
5 3
18
样例输出
5
#include<iostream>
using namespace std;
int main()
{
int n,*T,*Coins,i,j,m,*count,*num;
cin>>n;
T=new int[n];
Coins=new int[n];
for(i=0;i<n;i++)
cin>>T[i]>>Coins[i];
cin>>m;
count=new int[m+1];
num=new int[m+1];
for(i=1;i<=m;i++)
count[i]=0xfffffff;
count[0]=0;
for(i=0;i<n;i++)
{
for(j=0;j<=m;j++)
num[j]=0;
for(j=0;j<=m-T[i];j++)
{
if(num[j]<Coins[i]&&count[j]+1<count[j+T[i]])
{
count[j+T[i]]=count[j]+1;
num[j+T[i]]=num[j]+1;
}
}
}
if(count[m]!=0xfffffff)
cout<<count[m]<<endl;
else
cout<<"-1"<<endl;
delete []T;
delete []Coins;
delete []count;
delete []num;
return 0;
}

浙公网安备 33010602011771号