【算法小总结】母函数模板

研究以下多项式乘法:

可以看出:

x2项的系数a1a2+a1a3+...+an-1an中所有的项包括n个元素a1,a2,
…an中取两个组合的全体;

同理:x3项系数包含了从n个元素a1,a2,
…an中取3个元素组合的全体;

以此类推。 

特例:

若令a1=a2=
…=an=1,在(8-1)式中a1a2+a1a3+...+an-1an项系数中每一个组合有1个贡献,其他各项以此类推。故有:

母函数定义:

对于序列a0,a1,a2,…构造一函数:

n称函数G(x)是序列a0,a1,a2,…的母函数

 

实例分析

例1:若有1克、2克、3克、4克的砝码各一枚,能称出哪几种重量?各有几种可能方案? 

如何解决这个问题呢?考虑构造母函数。

如果用x的指数表示称出的重量,则:

  1个1克的砝码可以用函数1+x表示,

  1个2克的砝码可以用函数1+x2表示,

  1个3克的砝码可以用函数1+x3表示,

  1个4克的砝码可以用函数1+x4表示,

几种砝码的组合可以称重的情况,可以用以上几个函数的乘积表示:

(1+x)(1+x^2)(1+x^3)(1+x^4)

=(1+x+x^2+x^3)(1+x^3+x^4+x^7)

=1+x+x^2+2x^3+2x^4+2x^5+2x^6+2x^7+x^8+x^9+x^10 

  从上面的函数知道:可称出从1克到10克,系数便是方案数。

  例如右端有2x5项,即称出5克的方案有2:5=3+2=4+1;同样,6=1+2+3=4+2;10=1+2+3+4。

  故称出6克的方案有2,称出10克的方案有1 

 

 

 

//母函数模板
//形如(1+x^1+x^2+x^3+....+x^n)*(1+x^2+x^4+x^6+....+x^n)*......(1+x^m+x^2m+x^3m+....+x^n)

#include<iostream>
using namespace std;
const int lmax=10000;
int c1[lmax+1],c2[lmax+1];
int main()
{
 int n,i,j,k;
 while(cin>>n)
 {
    for(i=0;i<=n;i++)
    {
        c1[i]=1;c2[i]=0;
    }
    for(i=0;i<=n;i++) c1[i]=1;
    for(i=2;i<=n;i++)//一共有几个大括号(以第一个大括号为首,从与第二个大括号开始乘,
    //一直往下乘,直到完全算完,只有一个大括号)
    {
        for(j=0;j<=n;j++)//第一个大括号中的所有元素
           for(k=0;k+j<=n;k+=i)//第i个大括号中的所有元素
           {c2[j+k]+=c1[j];}
         for(j=0;j<=n;j++)//得到一个新的第一个大括号
         {
            c1[j]=c2[j];c2[j]=0;
         }

    }
    cout<<c1[n]<<endl;
 }
 return 0;
}

 

时间: 2024-08-06 09:42:50

【算法小总结】母函数模板的相关文章

ecshop小京东的模板切换到smarty3.1.3之去掉原生的php语法

在小京东的模板中,随处可以看到 <?php $GLOBALS['smarty']->assign('index_image',get_advlist('首页-分类ID'.$GLOBALS['smarty']->_var['goods_cat']['id'].'-左侧图片', 1)); ?> 类似这样的编码,由于smarty3.1不支持原生的php语句了,所以要做下调整,改成以下模式就可以了   {$index_image3=get_advlist('首页-分类ID3通栏广告', 1

百度出新算法小站长该如何面对

百度新出的绿萝算法是一种搜索引擎反作弊的算法.该算法主要打击超链中介.出卖链接.购买链接等超链作弊行为.我觉得百度新推出绿萝算法还是不错的,能够使网络信息进一步的得到安全,有效的防护.对于网站来说,用户才是上帝.网站就是尽一切的能力去维护用户的利益.百度这一新出的绿萝算法就是为了维护用户的利益.让用户可以少收到一些垃圾信息. 百度新出的绿萝算法虽然给一些小站长来了个错手不及.但也进一步要求一些小站长要想办好自己的网站靠小窍门是没有用的,最重要的还是要靠实力.实力才是硬道理.如果没有实力就会被百度

蚁群算法小程序(C/C++语言实现)(一)

算法解释: 程序开始运行,蚂蚁们开始从窝里出动了,寻找食物:他们会顺着屏幕爬满整个画面,直到找到食物再返回窝. 其中,'F'点表示食物,'H'表示窝,白色块表示障碍物,'+'就是蚂蚁了. 预期的结果:各个蚂蚁在没有事先告诉他们食物在什么地方的前提下开始寻找食物.当一只找到食物以后,它会向环境释放一种信息素,吸引其他的蚂蚁过来,这样越来越多的蚂蚁会找到食物!有些蚂蚁并没有象其它蚂蚁一样总重复同样的路,他们会另辟蹊径,如果令开辟的道路比原来的其他道路更短,那么,渐渐,更多的蚂蚁被吸引到这条较短的路上

【算法小总结】拓扑排序+例题解析

题目1449:确定比赛名次 时间限制:1 秒内存限制:128 兆特殊判题:否提交:669解决:293 题目描述: 有N个比赛队(1<=N<=500),编号依次为1,2,3,....,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前.现在请你编程序确定排名. 输入: 输入有若干组,每组中的第一行为二个数N(1<=N<=500),M:其中N表示队伍

【算法小总结】迪杰斯特拉(Dijkstra)求最短路径

此图是有向无负权指的图(弱连通图)   假设求1到6的最短路径,用迪杰斯特拉(Dijkstra)算法如何求?   迪杰斯特拉算法像无权最短路径算法一样,按阶段进行.假设s是起点,在每个阶段,迪杰斯特拉算法选择离s最近的一个顶点v,在v所有未知顶点中选取它能达到的,距离它最短的x顶点的路径长度D,若D小于s到x的长度(若没有路就是无穷大),替换s到x的长度D',同时声明s到v的最短路径是已知的.   其实核心算法就是一个使用贪心选取法则填表的for循环 若是路径带价值,加上价值即可,在判断的时候当

【算法小总结】Prim算法与Kruskal算法探索

以前以为自己用的生成最小生成树的方法是Prim算法,今天自己拜读了<数据结构与算法分析>之后才知道自己有多愚蠢,原来以前一直用的是KrusKal算法...... 今天好好说道说道这两个算法: KrusKal算法用于稀疏图,贪心策略,连续的按照最小的权值选择边. Prim算法用于稠密图,也是贪心策略,每次取离小生成树最近的点作为生成树的心点,并入生成树内生成新的小生成树,知道所有节点均被纳入生成树后结束.   这两种方法均可得到点点之间路径最短的联通图.   例如这个例子:   用Prim算法的

求助java算法小程序

问题描述 有120,95,85,75,65,50这几个数.任意选择3个以上数字相加总和等于325,求出有几组3个以上数.注意:也可以有重复数据,如:95958550这样一组数据 解决方案 解决方案二:顶.......解决方案三:帮顶!解决方案四:该回复于2011-03-14 10:42:06被版主删除解决方案五:如果允许重复的话很简单.先把数从大到小排序.然后用总数去减最大的数,一直减到不能减,在去减次大的数,一直重复.如果最后不能凑成功,把最后一个减数换次小的数来代替,重新计算,就可以了.解决

探秘推荐引擎之协同过滤算法小综述

      数学大神.统计学大神和数据挖掘推荐大神请关注. 一.数学期望的理解       早些时候,法国有两个大数学家,一个叫做布莱士·帕斯卡,一个叫做费马.帕斯卡认识两个赌徒,这两个赌徒向他提出了一个问题.他们说,他俩下赌金之后,约定谁先赢满5局,谁就获得全部赌金.赌了半天,A赢了4局,B赢了3局,时间很晚了,他们都不想再赌下去了.那么,这个钱应该怎么分?是不是把钱分成7份,赢了4局的就拿4份,赢了3局的就拿3份呢?或者,因为最早说的是满5局,而谁也没达到,所以就一人分一半呢?这两种分法都不

Java 实现的各种经典的排序算法小Demo

由于有上机作业,所以就对数据结构中常用的各种排序算法都写了个Demo,有如下几个: 直接插入排序 折半插入排序 希尔排序 冒泡排序 快速排序 选择排序 桶排序 Demo下载地址 下面谈一谈我对这几个排序算法的理解: 插入类算法 对于直接插入排序:(按从小到大的顺序) 核心原理: 若数组中只有一个元素,那么这就已经是有序的了:若数组中元素个数为两个,我们只需要对他们进行比较一次,要么交换顺序,要么不交换顺序就可以实现数组的内容的有序化:但是当数组内的元素的个数为N个呢?又该如何?这就催化了这个直接