本文内容参考下面的文章:
http://blog.youkuaiyun.com/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;
}