排列组合问题-母函数
2015-08-31 09:02
218 查看
母函数方法是用模拟多项式的办法来解决排列组合问题。
参考例题:HDU2079
http://acm.hdu.edu.cn/showproblem.php?pid=2079
例如多项式(1+x+x^2)(1+x^3)(1+x^4+x^8+x^12)可用来表示2个1(kg),1个3(kg),3个4(kg)的货物的排列组合。x^y前的系数即为组成y(kg)的方案数。
可以看到每个括号中的式子x的指数都是成比例增长,意为选择的此重量的个数,式子中的1均可看成x^0。例如(x^0+x^4+x^8+x^12)分别表示选择0,1,2,3个重量为4(kg)的货物。
模拟多项式乘法时,我们先将第1个括号和第2个括号的内容相乘,得到新式子。再与第3个括号的内容相乘,又得到新式子。再与第4个括号的内容相乘,依此类推......
上述代码为有限项的情况,无限项的情况去掉t<=num这个限制条件即可。
参考例题:HDU2079
http://acm.hdu.edu.cn/showproblem.php?pid=2079
例如多项式(1+x+x^2)(1+x^3)(1+x^4+x^8+x^12)可用来表示2个1(kg),1个3(kg),3个4(kg)的货物的排列组合。x^y前的系数即为组成y(kg)的方案数。
可以看到每个括号中的式子x的指数都是成比例增长,意为选择的此重量的个数,式子中的1均可看成x^0。例如(x^0+x^4+x^8+x^12)分别表示选择0,1,2,3个重量为4(kg)的货物。
模拟多项式乘法时,我们先将第1个括号和第2个括号的内容相乘,得到新式子。再与第3个括号的内容相乘,又得到新式子。再与第4个括号的内容相乘,依此类推......
#include<stdio.h> //HDU2079的代码,来自网络,自己添加的注释方便理解 //代码来源:http://www.cnblogs.com/gj-Acit/p/3201739.html int main() { int T; while(~scanf("%d", &T))while(T--) { int c1[41]={0},c2[41]={0}; //c1[]用来存储x指数幂的系数,c2用来存储每次计算得到的指数幂,用于过渡,为中间变量 int num,val; int i,n,k; scanf("%d%d", &n, &k); for(i = 1; i<=k;i++) { //计算第i个括号 scanf("%d%d",&val, &num); if(i ==1) { //第一个括号时进行初始化 for(int j = 0; j<=num && j*val<=n ;j++) { c1[j*val] = 1; c2[j*val] = 0; } } else { //c1[j]为之前已经计算过了的x^j的系数,因为要求n个学分有多少组合,所以上限为n for(int j = 0;j <= n;j ++ ) { //t表示指向下一个计算的式子的第t个元素,t*val使其按比例增长,t*val+j意为与前面相乘,即x^(t*val)与x^j的系数相乘,x^(t*val)因为是还未计算的式子,所以系数恒为1 for(int t = 0;t*val +j <=n && t<=num; t++) { c2[j+t*val] += c1[j]; } } //更新 for(j =0;j<=n;j++) { c1[j]=c2[j]; c2[j]=0; } } } //c1 即为n个学分的组合数 printf("%d\n", c1 ); } return 0; }
上述代码为有限项的情况,无限项的情况去掉t<=num这个限制条件即可。
相关文章推荐
- 牢记这次的目的
- json 数组 转bean
- 网站制作需要做的
- Social Emotional Computing
- HTML-字体逐渐显示
- 问题:ExecuteNonQuery 与 ExecuteScalar 结果: ExecuteNonQuery方法和ExecuteScalar方法的区别
- 对Oracle 、SQL Server、MySQL、PostgreSQL数据库优缺点分析
- 创建Python虚拟环境---Virtualenv
- 学习Qt5(2)
- 程序员学英语--打开另一个世界的钥匙
- 模仿手机qq的消息控制,Dialog实现
- ROS电子书及相关资料全集
- Leetcode #37 Sudoku Solver
- C的xml编程-libxml2(函数总结篇) http://blog.sina.com.cn/s/blog_6a1837e90100ns9j.html
- Java基础知识强化11:多态的两道基础题
- sitemesh学习
- Gradle 1.12用户指南翻译——第四十一章. 项目报告插件
- 一步步开发自己的博客 .NET版(1、基本显示)
- Gradle 1.12用户指南翻译——第四十一章. 项目报告插件
- Netty系列之Netty高性能之道