hdu 1284

钱币兑换问题

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

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:  1171 2191 2602 1248 1203 
这题可以采用母函数或者递推或者其他规律。
设d[i][j]为前i个硬币可以兑换j的兑法,考虑第i个,要么不取,兑法就为d[i-1][j],要么取,兑法就为d[i-1][j-v[i]];v[i]==i;
d[i][j]就等于这两种情况之和.(每种硬币的取还是不取的选择,从结果来看,能够包含兑换成j的硬币序列组合,就是说决策能够包含了所以可能的结果)。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
long long  d[42768];
void init()
{
    memset(d,0,sizeof(d));
}
int main()
{
    int n;
    while(~scanf("%d",&n))
    {
        init();
        if(n==0)
         {
             printf("0
");
             continue;
         }
        if(n==1)
        {
            printf("1
");
            continue;
        }
        d[0]=1;
         for(int i=1;i<=3;i++)
            for(int j=i;j<=n;j++)
         {

              d[j]=d[j]+d[j-i];
         }
        printf("%lld
",d[n]);
    }
    return 0;
}
原文地址:https://www.cnblogs.com/xianbin7/p/4530803.html