母函数的入门认知

趁热打铁,刚刚看了一个关于讲母函数的博客,觉得讲的很好,现在消化一下给自己写点东西。
那个博客的地址
以HDU OJ 钱币兑换问题这题为例子
(建议先看这个博客的解析再来看这个,不然会看不懂。。。)

Problem Description
在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。
Input
每行只有一个正整数N,N小于32768。
Output
对应每个输入,输出兑换方法数。
Sample Input
2934 12553
Sample Output
718831 13137761

#include <stdio.h>
#include <stdlib.h>
//HDU OJ 钱币兑换问题
int main()
{
    //需要创建一个数组,该数组的下标就是x的次数,对应的值就是x对应次数的系数
int c[1000000];
//然后是一个需要存储中间操作的数组
int temp[1000000];
int i,j,k;
//然后在这题中,先对一分的这个赋系数的初值,全是一(从x0 到x1000000),而存储中间操作的数组全变成0
for(i=0;i<1000000;i++){
    c[i]=1;
    temp[i]=0;
}
//然后就要开始前一项和后一项相乘了,然后把相乘的值存在第一项中,因为这个问题只涉及三项,所以就是i从2到三
for(i=2;i<=3;i++){
    for(j=0;j<1000000;j++){//这个就是第一项,代表的是x0 x1 x2 x3... j代表的就是对应系数
        for(k=0;k+j<=1000000;k+=i){//这个就是第二项,本题的第二项就是 x0 x2 x4.。。k代表的是对应系数
            //k+j的意思也就是(j1+j2)*(k1+k2)=j1*k1+j1*k2+j2*k1+j2*k2 这样子的 而j和k是次数 ,两项相乘等于次数相加
                temp[k+j]+=c[i];

        }
    }
    //再把中间操作的值放到最终目的地
    for(j=0;j<1000000;j++){
        c[i]=temp[i];
        temp[i]=0;
    }
}
    int n;//输入需要的硬币数
    scanf("%d",&n);
    printf("%d\n",c[n]);


return 0;
}

这类题目还需要多多努力多看几题才能入门!

发布了72 篇原创文章 · 获赞 5 · 访问量 2826

猜你喜欢

转载自blog.csdn.net/qq_41115379/article/details/104848760