码迷,mamicode.com
首页 > 其他好文 > 详细

UVa 674 Coin Change【记忆化搜索】

时间:2015-04-02 01:05:25      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:

题意:给出1,5,10,25,50五种硬币,再给出n,问有多少种不同的方案能够凑齐n

自己写的时候写出来方案数老是更少(用的一维的)

后来搜题解发现,要用二维的来写

http://blog.csdn.net/keshuai19940722/article/details/11025971

这一篇说的是会有面值的重复问题,还不是很理解

 

还有就是一个预处理的问题, 看了题解之后再自己写,很习惯的把处理dp数组写到while循环里面,一直tle

后来看到这篇题解

http://www.cnblogs.com/scau20110726/archive/2012/12/25/2832968.html

因为题目没有说会有多少组数据,如果把处理dp数组放在while循环里面的话,如果给出一个10w组的数据,那肯定就会超时(相当于每算一次,就要处理一次dp数组)

所以就把预处理放在外面就好啦

技术分享
 1 #include<iostream>  
 2 #include<cstdio>  
 3 #include<cstring> 
 4 #include <cmath> 
 5 #include<stack>
 6 #include<vector>
 7 #include<map> 
 8 #include<set>
 9 #include<queue> 
10 #include<algorithm>  
11 #define mod=1e9+7;
12 using namespace std;
13 
14 typedef long long LL;
15 const int INF = 0x7fffffff;
16 const int maxn=8005;
17 LL dp[maxn][15];
18 int coin[5]={1,5,10,25,50};
19 
20 LL dfs(int s,int i){
21     if(dp[s][i]!=-1) return dp[s][i];
22     
23     dp[s][i]=0;
24     for(int j=i;j<5&&s>=coin[j];j++)
25     dp[s][i]+=dfs(s-coin[j],j);
26     
27     return dp[s][i];    
28 }
29 
30 int main(){
31     int n;
32         memset(dp,-1,sizeof(dp));
33         for(int i=0;i<5;i++) dp[0][i]=1;
34     while(scanf("%d",&n)!=EOF){
35     
36         printf("%lld\n",dfs(n,0));
37     }
38     return 0;
39 }
View Code

 

UVa 674 Coin Change【记忆化搜索】

标签:

原文地址:http://www.cnblogs.com/wuyuewoniu/p/4385735.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!