用母函数的思路解释母函数的代码
来源:互联网 发布:添加网络位置 ftp 编辑:程序博客网 时间:2024/06/11 16:13
原文链接:http://www.cnblogs.com/lijunle/archive/2010/09/04/1817764.html
转载其中一部分
该文章建立在你已经看过母函数的相关数学知识的基础上,如果没有看过,建议看一下 hdu 论坛的母函数课件,传送门:http://acm.hdu.edu.cn/forum/read.php?tid=3853
用一个最简单的例子说明代码:
硬币面值有1元、5元、10元、25元、50元,一共5种,对于一个钱数 money,可以有多少中兑现方法?
很容易地构造母函数
G(x) = (x^0 + x^1 + x^2 + …) * (x^0 + x^5 + x^10 + …) * (x^0 + x^10 + x^20 + …)
* (x^0 + x^25 + x^50 + x^75 + …) * (x^0 + x^50 + x^100 + x^150 + …)
数学上的思路就拆开这个多项式因式,看看 x^money 的系数是多少。所以,编程的关键是如何实现拆分?
思路是 先把前面两个因式拆开,得到一个因式,代替第二个因式;然后用第二个因式(求出来的因式)和第三个因式相乘,代替第三个因式;递归计算到最后一个因式,得出结果。
由于便于编程的实现,我们在 G(x) 前面加多一个因式 (1*x^0 + 0*x^1 + 0*x^2 + … ),这个因式为1,所以并不改变母函数的值。把已经计算出来的因式的系数存放到一个数组 a 里面,把当前因式与下一个因式乘起来的因式的系数放到另外一个数组 b 里面。两个因式乘完了,就把 b 数组里面的数据放到 a 数组里面,把 b 数组清空,重复刚才的步骤,直到最后一个因式都乘进去了,才结束。此时,a 数据里面存放的就是拆分开来的多项式的系数。
代码如下:
#define M 500 int a[M];int b[M]; void GenerationFunction(){ int cent[5] = {1, 5, 10, 25, 50}; memset(a, 0, sizeof(a)); memset(b, 0, sizeof(b)); a[0] = 1; // 手动添加的一个多项式因式 (1*x^0 + 0*x^1 + 0*x^2 + … ) for(int i = 0; i < 5; i ++) // i 指向第几个多项式因式(从0开始算) { for(int j = 0; j < M; j ++) { // j 指向已经算出来的因式的指数,a[j] 存放的是指数为 j 的项的系数 for(int k = 0; j+k < M; k += cent[i]) { // k 代表下一个因式的指数,因式的指数是隔 cent[i] 递增的。 // 另外,因式中,指数为 k 的项的系数为 1 b[j+k] += a[j]; // 对于 a[j] * x^j * x^k = a[j] * x^(j+k) // 就把 x^(j+k) 的系数 a[j] 加到 存放当前答案的数组 b 里面 } } for(int j = 0; j < M; j ++) { // 把数组 b 元素滚动到 数组 a 去,以便递归进行乘法运算;另外,清空数组 b a[j] = b[j]; b[j] = 0; } }}
- 用母函数的思路解释母函数的代码
- 母函数代码思路的详细解释
- 【这篇不含代码】为什么会有母函数?母函数漫谈及其解题的思路。
- 函数的封装解释
- FORMAT函数的解释
- TriggerEvent函数的解释
- 递归函数的解题思路
- 母函数模板解释
- 母函数模板解释
- 母函数_解释
- STL函数代码解释
- MmAllocateContiguousMemory 函数自己的解释
- DrawIndexedPrimitive函数的详细解释
- DrawIndexedPrimitive函数的详细解释
- 对于setbuf函数的解释
- 关于函数指针的解释
- cvCalEMD2函数的一点解释
- DrawIndexedPrimitive函数的详细解释
- ASP.NET读取Excel文件的一些当时不懂的东西
- 控制平面与数据平面定义
- 最大堆插入算法
- 13-3-17 如何在fedora 16下以root用户登录
- 对于4个问题的感慨
- 用母函数的思路解释母函数的代码
- 第二次实验报告
- 电脑基本技能
- 判断字符串string所有分割和子串是否为回文(palindrome)并返回结果(Palindrome Partitioning)
- ZOJ BCD Code 记忆化搜索+数位DP+AC自动机
- 比较java的arraylist和linkedlist
- HDU 1588 Gauss Fibonacci
- Lua 程序设计初步
- Html/CSS菜单代码