首页 > 代码库 > hdu 1284 钱币兑换问题 (递推 || DP || 母函数)

hdu 1284 钱币兑换问题 (递推 || DP || 母函数)

钱币兑换问题

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 5069    Accepted Submission(s): 2868


Problem Description
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
 

 

Input
每行只有一个正整数N,N小于32768。
 

 

Output
对应每个输入,输出兑换方法数。
 

 

Sample Input
2934
12553
 

 

Sample Output
718831
13137761
 

 

Author
SmallBeer(CML)
 

 

Source
杭电ACM集训队训练赛(VII)
 

 

Recommend
lcy   |   We have carefully selected several similar problems for you:  1421 1978 1290 1996 3127 
 

 题目虽然简单,但是有不同的解决方法:

1、利用母函数打表:

 1 //515MS    492K    540 B    C++    
 2 #include<stdio.h>
 3 int ans[32770],tmp[32770];
 4 void init()
 5 {
 6     int n=32768;
 7     for(int i=0;i<=n;i++){
 8         ans[i]=1;
 9         tmp[i]=0;
10     }
11     for(int i=2;i<=3;i++){
12         for(int j=0;j<=n;j++)
13              for(int k=0;k+j<=n;k+=i)
14                  tmp[j+k]+=ans[j];
15         for(int j=0;j<=n;j++){
16             ans[j]=tmp[j];
17             tmp[j]=0;
18         }
19     }        
20 }
21 int main(void)
22 {
23     int n;
24     init();
25     while(scanf("%d",&n)!=EOF)
26     {
27         printf("%d\n",ans[n]);
28     }
29     return 0;
30 }
View Code

 

2、DP-完全背包:

 1 //15MS    356K    274 B    C++
 2 /*
 3     容量为j,质量为i
 4 */
 5 #include<stdio.h>
 6 int main(void)
 7 {
 8     int dp[32770]={0};
 9     dp[0]=1;
10     for(int i=1;i<=3;i++)
11         for(int j=i;j<=32768;j++)
12             dp[j]+=dp[j-i]; //只有i-1时情况加上有i的情况。 
13     int n;
14     while(scanf("%d",&n)!=EOF)
15     {
16         printf("%d\n",dp[n]);
17     }
18     return 0;
19 }
View Code

 

3、递推:

 1 //15MS    364K    361 B    C++
 2 #include<stdio.h>
 3 int ans[32770]={0};
 4 void init()
 5 {
 6     int n=32768;
 7     for(int i=0;i<=n;i++) //只有1、2时的情况 
 8         ans[i]=i/2+1;
 9     for(int i=3;i<=n;i++) //加上有3时的情况 
10         ans[i]+=ans[i-3];
11 } 
12 int main(void)
13 {
14     int n;
15     init();
16     while(scanf("%d",&n)!=EOF)
17     {
18         printf("%d\n",ans[n]);
19     }
20     return 0;
21 }
View Code