最少硬币问题

乱在长安 2012-05-20 09:51:11
一、 问题描述:
设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中。现要用这些面值的硬币来找钱。可以使用的各种面值的硬币个数存于数组Coins[1:n]中。对任意钱数0≤m≤20001,设计一个用最少硬币找钱m的方法。


输入
输入的第一行中只有1 个整数给出n的值,第2 行起每行2 个数,分别是T[j]和Coins[j]。最后1 行是要找的钱数m。
输出
程序运行结束时,将计算出的最少硬币数输出。问题无解时输出-1。
三、程序实现
//找零钱算法
//By falcon
//输入:数组m,依次存放从大到小排列的面值数,n为需要找的钱数,单位全部为分
//输出:数组num,对照数组m中的面值存放不同面值的硬币的个数,即找钱方案
四、程序代码:
#include <cstdio>
int T[11],Coins[11],n;
int c[20002],num[20002];
int main(int argc, char* argv[])
{
int i,j,m;
scanf("%d",&n); //n种钱币
for(i=0;i<n;++i)
scanf("%d%d",&T[i],&Coins[i]); // 各硬币的面值T[i],各硬币可用个数Coins[i]
scanf("%d",&m); //需要找钱的钱数m
for(i=1;i<=m;++i)
c[i]=0xfffffff; //初始化
c[0]=0;
for(i=0;i<n;++i)
{
for(j=0;j<=m;++j)
num[j]=0; //初始化,num[ ]记录已经使用的相应硬币个数
for(j=0;j<=m-T[i];++j)
if(num[j]<Coins[i]&&c[j+T[i]]>c[j]+1)
{
c[j+T[i]]=c[j]+1;
num[j+T[i]]=num[j]+1;
}
}
if(c[m]!=0xfffffff)
printf("%d\n",c[m]);
else
printf("-1\n");
return 0;
}
===========================================================
这是别人的代码,我的问题是 if(num[j]<Coins[i]&&c[j+T[i]]>c[j]+1)
{
c[j+T[i]]=c[j]+1;
num[j+T[i]]=num[j]+1;
}
这段无法理解,我的疑惑是num[j]为什么和coins[i]比较,而不是coins[j],还有num[j+T[i]]=num[j]+1;这句话也看不懂?
...全文
332 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
昵称很不好取 2012-05-20
  • 打赏
  • 举报
回复
动态规划问题,i指的硬币的种类,coins[i]表示某种硬币最多多少枚,使用该种类硬币不能超过这个限制

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧