zoukankan      html  css  js  c++  java
  • 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
     
    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
    ",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
    ",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
    ",ans[n]);
    19     }
    20     return 0;
    21 }
    View Code
  • 相关阅读:
    asp.net mvc 中直接访问静态页面
    (转)asp.net文本编辑器(FCKeditor)
    (转)后缀为 ashx 与 axd 的文件有什么区别
    最全的ASP.NET开源CMS汇总
    打造属于自己的设计模式
    分布式文件系统应用(上篇 理论)
    结合项目实例 回顾传统设计模式(一)策略模式
    动态方法与动态代理(上篇)
    分布式文件系统应用(下篇 实践)
    关于领域驱动设计与面向数据库设计
  • 原文地址:https://www.cnblogs.com/GO-NO-1/p/3695681.html
Copyright © 2011-2022 走看看