UVA 357 - Let Me Count The Ways

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

 1 #include<stdio.h>
2 typedef long long int llg;
3 #define MAXN 30010
4 llg f[MAXN][6];
5 int coin[] = {1,5,10,25,50};
6 int main()
7 {
8 int a,i,j;
9 llg ans;
10 for(i = 0; i < MAXN; i++)
11 for(j = 0; j < 5; j++)
12 {
13 f[i][j] = 1;
14 for(int k = 1; k <= j && i >= coin[k]; k++)
15 f[i][j] += f[i-coin[k]][k];
16 }
17 while(scanf("%d",&a)==1)
18 {
19 ans = f[a][4];
20 if(ans != 1)
21 printf("There are %lld ways to produce %d cents change.\n",ans,a);
22 else
23 printf("There is only 1 way to produce %d cents change.\n",a);
24 }
25 return 0;
26 }

 

转载于:https://www.cnblogs.com/lzxskjo/archive/2012/04/08/2437919.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值