组合数学之母函数

转载一位老铁的博客  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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值