您的位置:首页 > 其它

UVA 357 - Let Me Count The Ways

2012-04-08 20:00 453 查看
  其实同种类型的题我不想重复发的,感觉没意思。这题又是硬币问题,和147、674原理一样。只是我在做这题时遇到了新的问题,也算是有新的收获,就发一下吧。我曾和zxpn讨论过是之前就算好所有结果,还是每输入一个就计算一个效率高。当时我认为肯定是输一个算一个好,因为把所有的都算出来,并不是每个都会用的,也算一种浪费;而DP时用记忆化搜索会保存每次调用的所有数,如果下次也要调用的话就不必再算了,明显更好。今天遇到这题DP不行了,原因是数很大时用递归形式的DP会导致栈溢出。下面是代码:

#include<stdio.h>
typedef long long int llg;
#define MAXN 30010
llg f[MAXN][6];
int coin[] = {1,5,10,25,50};
int main()
{
int a,i,j;
llg ans;
for(i = 0; i < MAXN; i++)
for(j = 0; j < 5; j++)
{
f[i][j] = 1;
for(int k = 1; k <= j && i >= coin[k]; k++)
f[i][j] += f[i-coin[k]][k];
}
while(scanf("%d",&a)==1)
{
ans = f[a][4];
if(ans != 1)
printf("There are %lld ways to produce %d cents change.\n",ans,a);
else
printf("There is only 1 way to produce %d cents change.\n",a);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: