转载一位老铁的博客 http://blog.youkuaiyun.com/qq_27437781/article/details/51248300###;
母函数入门
“把组合问题的加法法则和幂级数的乘幂对应起来“
详细解释
我们拿1+x^2来说,前面已经说过,x表示砝码,x的指数表示砝码的重量!初始状态时,这里就是一个质量为2的砝码。
那么前面的1表示什么?按照上面的理解,1其实应该写为:1*x^0,即1代表重量为2的砝码数量为0个。
所以这里1+1*x^2 = 1*x^0 + 1*x^2,即表示2克的砝码有两种状态,不取或取,不取则为1*x^0,取则为1*x^2
Case one
砝码问题(有限问题)
Case two
邮票问题(无线问题)
应用 整数拆分 分数拆分
关于代码实现 http://blog.youkuaiyun.com/winter2121/article/details/55535894 参看这人博客 等回去自己总结下模板
第一种模板 无限的砝码的情况 训练的题目 HDOJ 1028
模板
int i,j,k;//为循环变量
int c1[max],c2[max];//定义滚动数组 c1是储存 最后的结果 c2是储存临时的结果
while(cin>>nNum)//读取目标值
{
for(int i=0;i<=nNmu;i++) //来个循环初始化 c1,c2
c1[i]=1;
c2[i]=0;
for(int i=2;i<=nNum;i++) //第一重循环 为了计算所有的 n个括号 需要计算 n-1 次
for(k=0;k<=nNum;k++) //当前的 第一个括号
for(j=0;j+k<=nNum;j++) //当前第二个括号
c2[j+k]+=c1[j]; // j+k为 x的指数 每当这个指数出现就 +1; 过程为 x 与第二括号每个都相乘 然后x^2
for(i=0;i<=nNum;i++) //重置滚动数组
{
c1[i]=c2[i];
c2[i]=0;
}
}
训练的题目还有 HDOJ 1398 贴出了自己写的关键部分
for(i=0;i<=nNum;i++)
{
c1[i]=1;
c2[i]=0;
}
for(i=2;i*i<=nNum;i++)//i*i<=nNum 是为了确定等式 的个数 可以想想 单个硬币尽可能接近目标数字
{ for(j=0;j<=nNum;j++) //每一个当前的第一次括号都有的 n+Num个x 指数不同的项 不同的题目可能会有所不同
for(k=0;k+j<=nNum;k+=i*i)//同理
c2[j+k]+=c1[j];
for(k=0;k<=nNum;k++) //这个要在括号里循环
{
c1[k]=c2[k];
c2[k]=0;
}
}
快速幂运算 http://blog.youkuaiyun.com/PNAN222/article/details/51043846