母函数
母函数,又称生成函数,是ACM竞赛中经常使用的一种解题算法,常用来解决组合方面的题目。
第一种问题:
有1克、2克、3克、4克的砝码各一枚,能称出哪几种重量?每种重量各有几种可能方案?
我们用母函数来解决这个问题
1个1克砝码可以看成1+x^1,1表示不取,x^1表示取一个,以下同理 1个2克砝码可以看成1+x^2 1个3克砝码可以看成1+x^3 1个4克砝码可以看成1+x^4
第二种问题:
求用1分、2分、3分的邮票贴出不同数值的方案数: 大家把这种情况和第一种比较有何区别?第一种每种是一个,而这里每种是无限的。
#include <iostream> using namespace std; const int _max = 10001; // c1是保存各项质量砝码能够组合的数目 // c2是中间量。保存没一次的情况 int c1[_max], c2[_max]; int main() { int nNum; int i, j, k; while(cin >> nNum) { for(i=0; i<=nNum; ++i) // ---- ① { c1[i] = 1; c2[i] = 0; } for(i=2; i<=nNum; ++i) // ----- ② { for(j=0; j<=nNum; ++j) // ----- ③ for(k=0; k+j<=nNum; k+=i) // ---- ④ { c2[j+k] += c1[j]; } for(j=0; j<=nNum; ++j) // ---- ⑤ { c1[j] = c2[j]; c2[j] = 0; } } cout << c1[nNum] << endl; } return 0; }
可以到hdu acm上练习母函数
HDOJ 1028 1085 1171 1248 1398 1709 2069 2152
其它相关题目(比如求邮票、硬币之类的组合数、整数的不同拆分数等)