`
com_xpp
  • 浏览: 353928 次
社区版块
存档分类
最新评论

最少硬币问题

 
阅读更多

/*日期:2011-10-21
作者:xiaosi
题目: 最少硬币问题
*/

问题描述:
设有n 种不同面值的硬币,各硬币的面值存于数组T〔1:n〕中。现要用这些面值的硬
币来找钱。可以使用的各种面值的硬币个数存于数组Coins〔1:n〕中。
对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。
?编程任务:
对于给定的1≤n≤10,硬币面值数组T和可以使用的各种面值的硬币个数数组Coins,
以及钱数m,0≤m≤20001,编程计算找钱m的最少硬币数。
?数据输入:
由文件input.txt 提供输入数据,文件的第一行中只有1 个整数给出n的值,第2 行起每
行2 个数,分别是T[j]和Coins[j]。最后1 行是要找的钱数m。
?结果输出:
程序运行结束时,将计算出的最少硬币数输出到文件output.txt中。问题无解时输出-1。
输入文件示例 输出文件示例
input3
1 3
2 3
5 3
18
output
5


#include<iostream>
using namespace std;
int main()
{
int n,i,m,t,v;

cin>>n;
int *value=new int [n+1],*value1=new int [n+1];
int *q=new int [n+1];
for(i=1;i<=n;i++)
{ cin>>value[i]>>q[i];
value1[i]=value[i]*q[i];}
cin>>m;
int *way=new int [m+1];
int *way1=new int [m+1];
way1[0]=way[0]=0;
for(i=1;i<=m;i++)
{
if(value1[1]>=i&&i%value[1]==0)
way1[i]=way[i]=i/value[1];
else
way1[i]=way[i]=0;

}

int j;
for(j=2;j<=n;j++)
{
for(i=value[j];i<=m;i++)
{

t=1;
while(t<=q[j]&&value[j]*t<=i)
{
if((i-value[j]*t)&&way[i-value[j]*t]==0)
{ t++;
continue;}
else
v=t+way[i-value[j]*t];
if(way1[i]==0||way1[i]>v)
way1[i]=v;
t++;
}
}

for(i=1;i<=m;i++)
{ way[i]=way1[i];

}

}
if(way[m]==0)
way[m]=-1;
cout<<way[m]<<endl;


return 0;
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics