HDOJ 1284 钱币兑换问题

转自:wutianqi http://www.wutianqi.com/?p=981

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1284

tag:母函数

直接套母函数的模版~~~

#include <iostream>

using namespace std;

 

int c1[32768], c2[32768] = {0};

int main()

{

    int i, j, k, h;

 

    for (i = 0; i <= 32767; i++)

        c1[i] = 1;

    for (i = 2; i <= 3; i++)

    {

        for (j = 0; j <= 32767; j++)

        {

            for (k = 0; k + j <= 32767; k += i)

            {

                c2[k + j] += c1[j];

            }

        }

        for (h = 0; h <= 32767; h++)

        {

            c1[h] = c2[h];

            c2[h] = 0;

        }

    }

 

    int n;

    while (scanf("%d", &n) != EOF)

        printf("%d\n", c1[n]);

 

    return 0;

}

后来发现这题其实可以不用母函数的:
思路:
直接COPY网上的了。
就是求2x+3y+k=m的问题这时m就可以写成m=6*q+k;
带入上式子 可得到 y=3*q+k/2-3*x/2;
x的取值0-2*q之间的偶数
有1+q中 所以else后面要加1

#include <stdio.h>

int main()

{

    __int64 n,i,j,sum;

    while(scanf("%I64d",&n)==1)

    {

        sum=0;

        for(i=0;i<=n/3;i++)

        {

            sum+=(n-i*3)/2+1;

        }

        printf("%I64d\n",sum);

    }

}

最后一个,还是母函数的思想,但是时间是0MS~~~
AMB教主的代码~~~Orz

#include<iostream>

using namespace std;

 

int num[32768];

void main()

{

    int n,i;

    num[0]=1;

    for(i=1;i<32768;i++)

        num[i]+=num[i-1];

    for(i=2;i<32768;i++)

        num[i]+=num[i-2];

    for(i=3;i<32768;i++)

        num[i]+=num[i-3];

    while(cin>>n)

        printf("%d\n",num[n]);

}

 

你可能感兴趣的:(问题)