最少硬币问题

/*日期: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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值