HDU 1085 Holding Bin-Laden Captive! (母函数)

HDU 1085

学习母函数的时候看到这个题最水,就从他下手了,英语课看百度百科关于母函数的讲解,看的有点懵

母函数分两种:普通型生成函数,指数型生成函数,先从普通型生成函数开始

其实没有想象的那么复杂,之所以构建母函数,并且用多项式相乘的方式进行计算,推测大概就是因为指数进行运算时指数相加,指数模拟的是数的加法,而乘法有利于数的遍历,其中每个数的系数表示生成该指数的方式数,所以在我看来普通型生成函数就是一个简单的模拟过程,继续刷一刷题

#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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值