母函数
母函数,又称生成函数,是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
其它相关题目(比如求邮票、硬币之类的组合数、整数的不同拆分数等)
浙公网安备 33010602011771号