zoukankan      html  css  js  c++  java
  • 母函数通用模板

    本文内容参考下面的文章:

    http://blog.csdn.net/xiaofei_it/article/details/17042651


    看下面的问题:



    解决上述问题的通用代码模板如下:

    #include<iostream>
    using namespace std;
    
    //动态内存分配不用memset或memcpy来初始化或复制数组
    
    int main()
    {
    	int i,j,m;//循环变量
    
    	int k;//有k种硬币,则有k个()相乘
    
    	int *v = new int[k+1];//v[0]不用,v[i]为第i种硬币的价值
    
    	//s和e的含义:第i种硬币至少用s[i]个,至多用e[i]个
    	int *s = new int[k+1];//s[0]不用
    	int *e = new int[k+1];//e[0]不用
    
    	/*
    	*	k,v,s,e的具体值需要自行输入或设置
    	*/
    
    	//计算最高次数MAX = 最高次数
    	int MAX = 0;
    	for(i=1;i<=k;i++)	
    		MAX += v[i]*e[i];
    
    	int *a = new int[MAX+1];//a和b用于记录运行结果
    	int *b = new int[MAX+1];
    	for(i=0;i<=MAX;i++)	
    	{
    		a[i] = 0;
    		b[i] = 0;
    	}
    	a[0] = 1;
    	
    	//下面是相乘的过程,代码很难理解!!!
    	for(i=1;i<=k;i++)
    	{
    		//for(m=0;m<=MAX;m++)		b[m]=0;
    		for(j=s[i];j<=e[i] && j*v[i]<=MAX;j++)
    			for(m=0;m+j*v[i]<=MAX;m++)
    				b[m+j*v[i]] += a[m];
    		for(m=0;m<=MAX;m++)
    		{
    			a[m] = b[m];
    			b[m] = 0;
    		}
    	}
    
    	/*
    	*程序运行至此,a[1],a[2],...,a[MAX]是x,x^2,...,x^MAX的系数
    	*/
    
    	return 0;
    }
    由于上述代码可以解决多数母函数问题,所以,即使不能理解代码,可以先背下来,遇到题目直接套用,也许用着用着,就理解了.


    下面,利用上面的模板,求解一个例题


    根据生成函数可知,参数如下:

    k=3.

    v[1]=1,v[2]=3,v[3]=5.

    s[1]=0,s[2]=1,s[3]=0.

    e[1]=2,e[2]=2,e[3]=3.

    代入模板,即可.


    代码如下:

    #include<iostream>
    using namespace std;
    
    int main()
    {
    	int i,j,m;
    	int k = 3;
    	int v[] = {0,1,3,5};
    	int s[] = {0,0,1,0};
    	int e[] = {0,2,2,3};
    	//上述v[0],s[0],e[0]都不会用到
    
    	int MAX = 0;
    	for(i=1;i<=k;i++)
    		MAX += v[i]*e[i];
    	int *a = new int[MAX+1];
    	int *b = new int[MAX+1];
    
    	for(i=0;i<=MAX;i++)
    	{
    		a[i] = 0;
    		b[i] = 0;
    	}
    	a[0] = 1;
    
    	//开始计算
    	for(i=1;i<=k;i++)
    	{
    		for(j=s[i];j<=e[i] && j*v[i]<=MAX;j++)
    			for(m=0;m+j*v[i]<=MAX;m++)
    				b[m+j*v[i]] += a[m];
    
    		for(m=0;m<=MAX;m++)
    		{
    			a[m] = b[m];
    			b[m] = 0;
    		}
    	}
    
    	//输出的分别是x,x^2,x^3,...,x^MAX的系数
    	for(i=1;i<=MAX;i++)
    		cout << a[i]<< "  ";
    	cout << endl;
    
    	return 0;
    }

  • 相关阅读:
    图像滤镜艺术---乐高像素拼图特效滤镜的代码实现
    假设你也23
    seajs载入流程图
    android 怎样将主菜单图标改成按安装时间排序
    热力学第一定律的社会学思考
    Django创建数据表
    KeyPress 和KeyDown 、KeyPress之间的区别
    Delphi 制作自定义数据感知控件并装入包(dpk文件)中(与DBText类似的数据感知控件)
    Delphi中的窗体创建与销毁
    Delphi ADOQuery连接数据库的查询、插入、删除、修改
  • 原文地址:https://www.cnblogs.com/tensory/p/6590760.html
Copyright © 2011-2022 走看看