组合数学之母函数

转载一位老铁的博客  http://blog.csdn.net/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.csdn.net/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.csdn.net/PNAN222/article/details/51043846


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部