描述
设有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; }