学习母函数的时候看到这个题最水,就从他下手了,英语课看百度百科关于母函数的讲解,看的有点懵
母函数分两种:普通型生成函数,指数型生成函数,先从普通型生成函数开始
其实没有想象的那么复杂,之所以构建母函数,并且用多项式相乘的方式进行计算,推测大概就是因为指数进行运算时指数相加,指数模拟的是数的加法,而乘法有利于数的遍历,其中每个数的系数表示生成该指数的方式数,所以在我看来普通型生成函数就是一个简单的模拟过程,继续刷一刷题
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<set>
#include<map>
#include<queue>
#include<cmath>
using namespace std;
#define maxn 8 * 1000 + 5
int n1[maxn], n2[maxn];
int main()
{
int val[3] = {1, 2, 5};
int n[3];
while(scanf("%d%d%d",&n[0],&n[1],&n[2]) != EOF)
{
if(n[0] == 0 && n[1] == 0 && n[2] == 0) break;
memset(n1, 0, sizeof(n1));//存放每一项前的系数,例如n1[5] = 2就代表x^5系数为2
memset(n2, 0, sizeof(n2));//存放中间值
int maxy = 0;
for(int i = 0; i < 3; i ++)//计算理论最大数值
maxy += n[i] * val[i];
for(int i = 0; i <= n[0]; i ++)//预处理第一个多项式
n1[i] = 1;
for(int i = 1; i < 3; i ++)//遍历除第一个多项式外的所有多项式
{
for(int j = 0; j <= maxy; j ++)
{
if(n1[j])//如果存在该项
{
for(int k = 0; k <= val[i] * n[i]; k += val[i])//模拟多项式相乘
if(j + k <= maxy)
n2[j + k] += n1[j];
}
}
memcpy(n1, n2, sizeof(n1));//将结果存在n1中
memset(n2, 0, sizeof(n2));//清空n2
}
int i;
for(i = 0; i <= maxy; i ++)
{
if(!n1[i])
{
//flag = i;
break;
}
}
printf("%d\n",i);
}
return 0;
}