[HDU1085][HDU1028][HDU2013] 组合数学入门(母函数、递推)
来源:互联网 发布:win7万能网络驱动下载 编辑:程序博客网 时间:2024/05/16 04:03
先来说一说母函数,今天是第一次学。杭电关于母函数的PPT感觉不错,挺适合入门看看的。
什么是母函数?对于序列a0,a1,a2,…构造一函数:G(x)=a0+a1*x+a2*x^2+...G(x)就是序列a0,a1...的母函数。如若已知序列a0,a1,a2,…则对应的母函数G(x)便可根据定义给出。 反之,如若已经求得序列的母函数G(x),则该序列也随之确定。 序列a0,a1,a2,…可记为{an}
如何用母函数来解决诸如整数拆分、邮票组合、砝码称重一类的问题?这一类问题大致是需要找到整数拆分的方案数,邮票可以组合出多少面额,某一种重量可以由多少种砝码组合来完成称重……当然利用类似动态规划的思想往往也可以解决这类问题,下面讨论怎么使用母函数来完成。
下面来是我对这种母函数构造方式的理解。
对于上面的例1,如果取消砝码个数的限制,则母函数变为G(x)=(1+x+x^2+,,,,,)(1+x^2+x^4+...)(1+x^3+x^6+...)(1+x^4+x^8+..)
若要称量重量M,那么这个质量M就对应母函数展开后的x^M项。而x^M项的指数M按照数学上的展开来理解是什么来的呢?
假设M=14,我们用1个1g砝码,1个2g砝码,1个3g砝码和2个4g砝码。则可以看做是从G(x)=(1+x+x^2+,,,,,)(1+x^2+x^4+...)(1+x^3+x^6+...)(1+x^4+x^8+..)的每一个括号(每个括号分别对应1g, 2g, 3g, 4g砝码单独可以组合出哪些质量)里取出了x, x^2, x^3, x^8。然后意会一下为什么x^M项对应的系数就是称量质量M的方案数了。如果理解的话这一类问题就都可以做了。
实现起来,展开G(x)函数的时候就是按照平时自己手工怎么展开来做的。
HDU1028(母函数) Ignatius and the Princess III
什么是母函数?对于序列a0,a1,a2,…构造一函数:G(x)=a0+a1*x+a2*x^2+...G(x)就是序列a0,a1...的母函数。如若已知序列a0,a1,a2,…则对应的母函数G(x)便可根据定义给出。 反之,如若已经求得序列的母函数G(x),则该序列也随之确定。 序列a0,a1,a2,…可记为{an}
如何用母函数来解决诸如整数拆分、邮票组合、砝码称重一类的问题?这一类问题大致是需要找到整数拆分的方案数,邮票可以组合出多少面额,某一种重量可以由多少种砝码组合来完成称重……当然利用类似动态规划的思想往往也可以解决这类问题,下面讨论怎么使用母函数来完成。
下面这个例子来自HDU集训的PPT
“例1:若有1克、2克、3克、4克的砝码各一 枚,能称出哪几种重量?各有几种可能方案?理解了这个例子之后整数拆分、邮票组合、砝码称重一类的问题就都一并解决了。
如何解决这个问题呢?考虑构造母函数。如果用x的指数表示称出的重量,则:
1个1克的砝码可以用函数1+x表示,1个2克的砝码可以用函数1+x2表示,
1个3克的砝码可以用函数1+x3表示,1个4克的砝码可以用函数1+x4表示,
几种砝码的组合可以称重的情况,可以用以上几个函数的乘积表示:
(1+x)(1+x^2)(1+x^3)(1+x^4)
=(1+x+x^2+x^3)(1+x3+x^4+x^7)
=1+x+x^2+2x^3+2x^4+2x^5+2x^6+2x^7+x^8+x^9+x^10
从上面的函数知道:可称出从1克到10克,系数便是方案数。
”
下面来是我对这种母函数构造方式的理解。
对于上面的例1,如果取消砝码个数的限制,则母函数变为G(x)=(1+x+x^2+,,,,,)(1+x^2+x^4+...)(1+x^3+x^6+...)(1+x^4+x^8+..)
若要称量重量M,那么这个质量M就对应母函数展开后的x^M项。而x^M项的指数M按照数学上的展开来理解是什么来的呢?
假设M=14,我们用1个1g砝码,1个2g砝码,1个3g砝码和2个4g砝码。则可以看做是从G(x)=(1+x+x^2+,,,,,)(1+x^2+x^4+...)(1+x^3+x^6+...)(1+x^4+x^8+..)的每一个括号(每个括号分别对应1g, 2g, 3g, 4g砝码单独可以组合出哪些质量)里取出了x, x^2, x^3, x^8。然后意会一下为什么x^M项对应的系数就是称量质量M的方案数了。如果理解的话这一类问题就都可以做了。
实现起来,展开G(x)函数的时候就是按照平时自己手工怎么展开来做的。
两个母函数练手题,性质都是一样的
HDU1085(母函数) Holding Bin-Laden Captive!
http://acm.hdu.edu.cn/showproblem.php?pid=1085
硬币面额1,2,5且有数量限制num1,num2,num3,问最小不能组合的数量是多少。
G(x)=(1+x+...+x^num1)(1+x^2+...+x^2num2)(1+x^5+,,,+x^5num3),展开,系数不为0的数都是可以由硬币组合出来的。
#include <cstdio>#include <cstring>using namespace std;const int maxexp=1*1000+2*1000+5*1000+10;int main(){ int n1, n2, n3; bool f; int c1[maxexp+1], c2[maxexp+1], c3[maxexp+1]; while (scanf("%d%d%d", &n1, &n2, &n3)==3 && n1+n2+n3>0) { memset(c1, 0, sizeof(c1)); memset(c2, 0, sizeof(c2)); memset(c3, 0, sizeof(c3)); for (int i=0; i<=n1; i++) //1+x+x^2+...+x^n1 c1[i]=1; for (int j=0; j<=n1; j++) for (int k=0; k<=2*n2; k+=2) //1+x^2+...+x^(2*n2) c2[j+k]+=c1[j]; for (int j=0; j<=n1+2*n2; j++) for (int k=0; k<=5*n3; k+=5) //1+x^2+...+x^(5*n2) c3[j+k]+=c2[j]; f=false; for (int j=0; j<=n1+2*n2+5*n3; j++) if (c3[j]==0) { printf("%d\n", j); f=true; break; } if (!f) printf("%d\n", n1+2*n2+5*n3+1); } return 0;}
HDU1028(母函数) Ignatius and the Princess III
http://acm.hdu.edu.cn/showproblem.php?pid=1028
整数拆分。由于拆分结果只考虑有几个1几个2几个3...不考虑顺序什么的,那么问题就和之前的砝码邮票什么的一样了。
G(x)=(1+x+...)(1+x^2+...)(1+x^3....)...(1+x^n)
n最大120,可以预处理一下保存结果,也可以一边输入一边重新算,反正n很小……
#include <cstdio>#include <cstring>using namespace std;const int maxexp=120;int main(){ int n, now, pre; int f[2][maxexp+1]; //"滚筒"使用 while (scanf("%d", &n)==1) { memset(f, 0, sizeof(f)); for (int i=0; i<=n; i++) //1+x+x^2+...+x^n f[1%2][i]=1; for (int i=2; i<=n; i++) { now=i%2; pre=(i-1)%2; for (int j=0; j<=n; j++) f[now][j]=0; for (int j=0; j<=n; j++) //枚举之前结果 for (int k=0; k+j<=n; k+=i) //枚举当前多项式 1+x^i+x^2i+... { f[now][j+k]+=f[pre][j]; //中间结果保存在c2 } } printf("%d\n", f[n%2][n]); } return 0;}
HDU2013
赤裸裸的递推,毫无技术性而言
f(n)=(f(n-1)+1)*2, 从最后一天逆推。
#include <cstdio>#include <cstdlib>int main(){ int f[32], n; f[1]=1; for (int i=2; i<30; i++) f[i]=(f[i-1]+1)*2; while (scanf("%d", &n)==1) printf("%d\n", f[n]); return 0;}
- [HDU1085][HDU1028][HDU2013] 组合数学入门(母函数、递推)
- HDU1028-HDU1085-母函数(生成函数)
- HDU1028关于母函数以及递推
- hdu1085【母函数入门】
- HDU1028(母函数)
- 普通型母函数学习小记 Hdu1028 + Hdu1085 Holding Bin-Laden Captive! +Hdu2082
- hdu1085(母函数解有限个硬币组合问题)
- hdu1028;hdu1398——母函数入门
- hdu1292 组合数学+递推
- bzoj3997 组合数学 递推
- HDU6143 组合数学 递推
- 【完全背包/母函数/递推】HDU1028-Ignatius and the Princess III
- hdu1085 母函数(初始化问题很重要)
- hdu1085 母函数
- hdu1085(母函数)
- HDU1085(母函数)
- HDU1085(母函数)
- HDU1085(母函数模板)
- 内存分配策略(静态,栈式,堆式的比较)
- android实现联网小例子,刚学习与大家分享
- PLSQL导入导出数据库
- code::blocks10.05调试多线程报错解决办法
- js返回历史上一页并刷新页面
- [HDU1085][HDU1028][HDU2013] 组合数学入门(母函数、递推)
- poj2914——Minimum Cut//最小割Stoer_Wagner
- Oracle grant用户授权
- fcommand调用exe应用程序
- MySQL 的自动补全功能
- SQLSEVER2005中找不到存储过程xp_getfiledetails 解决办法
- asp.net ajax 无法弹出alert对话框的解决方法
- 数据库连接断开,数据库连接池报错问题
- Hadoop Summit 2011: HDFS Federation and Other New Features