• HDU 1284


    HDU  1284   - 钱币兑换问题
    Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    Description

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

    Input

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

    Output

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

    Sample Input

    2934
    12553
     

    Sample Output

    718831
    13137761
     
     
    dp                               [i][0] [i][1] [i][2] [i][3] [i][4]    
    没有硬币    i=0; 0 0   0 0 0    
    有1分硬币  i=1; 1(考虑到边界情况,规定为1) 1 1 1 1    
    有1分、2分硬币  i=2; 1 1 2 2 3    
    有1分、2分、3分硬币   i=3; 1 1 2 3 5    
    状态的意义:dp[i][j]表示有1到i这i种硬币,兑换j分有dp[i][j]种方法
       状态转移方程:dp[i][j]=dp[i-1][j]+dp[i][j-i]+dp[i][j-2*i]+...dp[i][j-n*i];
     
    决策:新加入一种硬币后,可以选1个,也可以选2个...选n个
     
    以下代码简化为一维数组
     
     
    我的代码:

    #include<cstdio>
    #include<string>
    #include<cstring>
    #include<iostream>
    #include<cmath>
    #include<algorithm>
    #include<climits>
    #include<queue>
    #include<vector>
    #include<map>
    #include<sstream>
    #include<set>
    #include<stack>
    using namespace std;
    //typedef long long ll;
    //ifstream fin("input.txt");
    //ofstream fout("output.txt");
    //fin.close();
    //fout.close();
    int dp[32775];
    int main()
    {
    int i,j,n;
    memset(dp,0,sizeof(dp));
    dp[0]=1;
    for(i=1;i<=3;i++)
    {
    for(j=i;j<=32775;j++)
    {
    dp[j]+=dp[j-i];
    }
    }
    while(scanf("%d",&n)==1)
    {
    printf("%d ",dp[n]);


    }

    return 0;
    }

  • 相关阅读:
    手打AC的第2道数位DP:BZOJ1799: [Ahoi2009]self 同类分布
    Oracle PL/SQL编程基础
    Oracle高级查询,事物,过程及函数
    缓存技术
    图形化报表
    网站配置与部署
    Oracle 空间管理
    Oracle 10g体系结构及安全管理
    ORACLE 数据库概述
    jQuery中的Ajax应用
  • 原文地址:https://www.cnblogs.com/yskyskyer123/p/4513904.html
Copyright © 2020-2023  润新知