LeeBlog

导航

随笔分类 -  母函数

HDU 1059 Dividing 多重背包
摘要:这题想了想用母函数应该也可以做,不过得考虑一个细节,就是加起来的总和是否为奇数,我找了好久一直没找出错误,原来是没考虑奇数。。 fuck 这种问题我怎么能不考虑奇数呢。。。。。 啊 啊 啊啊 啊啊啊 啊啊啊啊 啊 啊啊啊啊好吧。。 上代码。。 二进制优化。。。 如果能拼出他们总和的平均值。那么在他们的平均值背包里能装下平均值。。#include<stdio.h>#include<string.h>int num[7],dp[200005],ave;inline int max( int a,int b ){ return a > b ? a : b; }void 阅读全文

posted @ 2011-05-20 10:27 LeeBlog 阅读(256) 评论(0) 推荐(0)

母函数用多重背包来解
摘要:其实母函数基本都可以用多重背包来解,我在做母函数时,我的代码500多MS有的甚至过不了,而cadl神的是0MS,就倍感惊讶啊,我的超时,为神马别人的那么少啊,一问原来是用背包做的,这里来讲一讲母函数用背包做的一点小理解吧,以HDU 1284为例,dp[j]代表着钱为j时的选法,当循环到第i次时,(即前面的coin[1,2....i-1]已经选完了 )对于j有两种选法,一:不选coin[i],那么它的选法就是原来不选coin[i]的选法dp[j],选coin[i]的选法有多少种呢???? 不就是dp[j-coin[i]] ( 为神马是这样呢?因为你如果在j那里选了coin[i],那么他选coin 阅读全文

posted @ 2011-05-18 17:07 LeeBlog 阅读(311) 评论(0) 推荐(0)

HDU 1085 Holding Bin-Laden Captive! 母函数||背包||递推
摘要:水题 。。 直接把所有可能枚举。。 最后找出没有可能的,即系数为0 的最小数#include<stdio.h>#include<string.h>int s[4] = {0,1,2,5},m1[100000],m2[100000],num[4],max;void gf( ){ memset( m1,0,sizeof( m1 ) ); memset( m2,0,sizeof( m1 ) ); for( int i = 0; i <= num[1]; ++i ) m1[i] = 1; for( int i = 2; i <= 3; ++i ) { for( in 阅读全文

posted @ 2011-05-12 10:37 LeeBlog 阅读(185) 评论(0) 推荐(0)

HDU 1398 Square Coins
摘要:好吧。。 这题是母函数的同一类型题。。。。。暴力也可以过#include<stdio.h>int sq[18],m1[305],m2[305];void chart( ){ for( int i = 0; i < 305; ++i ) m1[i] = m2[i] = 0; for( int i = 0; i < 18; ++i ) sq[i] = i * i; m1[ 0 ] = 1; for( int i = 1; i <= 17; ++i ) { for( int j = 0; j <= 300; ++j ) for( int k = 0; ( j + 阅读全文

posted @ 2011-05-12 08:59 LeeBlog 阅读(159) 评论(0) 推荐(0)

HDU 2082 找单词
摘要:这题是母函数的一基本题。跟2079差不多http://www.cnblogs.com/Lvsi/archive/2011/05/11/2043707.html不过这里相邻括号递增的幂是依次递增的,不过这次我又犯了一个错误,很严重的,在写k的时候竟然写成k*i<= map[i]oh~ so bad ... 以后谨记#include<stdio.h>int map[28],m1[100],m2[100],n;void gf( ){ m1[0] = 1; for( int i = 1; i <= 26; ++i ) { for( int j = 0; j <= 50; 阅读全文

posted @ 2011-05-12 08:36 LeeBlog 阅读(221) 评论(0) 推荐(0)

HDU 2079 选课时间(题目已修改,注意读题) 母函数 || 多重背包
摘要:今天做这题才知道原来母函数的原型不是从第二个括号开始,那不过是优化而已,除了1^n,2^n那种类型可以从2开始外其他都要从1开始。好了,上代码吧。#include<stdio.h>int n,k,m1[450],m2[450],t,a,b;int num[15],sc[15];void gf( ){ for( int i = 0; i <= num[1];i++ ) m1[i*sc[1]] = 1; for( int i = 2; i <= k;++i ) { for( int j = 0; j <= n; ++j ) for( int l = 0; l < 阅读全文

posted @ 2011-05-11 22:00 LeeBlog 阅读(623) 评论(1) 推荐(0)

HDU 1284 钱币兑换问题 母函数 or 完全背包
摘要:i相信知道做前面那个后这个应该很水了#include<stdio.h>int m1[40000],m2[40000];void chart( ){ for( int i = 0 ; i <=32780; ++i ) { m1[i] = 1; m2[i] = 0; } for( int i = 2; i <= 3;++i ) { for( int j = 0; j <= 32780; ++j ) for( int k = 0; k + j <= 32780; k += i ) m2[j + k] += m1[j]; for( int j = 0; j < 阅读全文

posted @ 2011-03-26 21:15 LeeBlog 阅读(265) 评论(0) 推荐(0)

HDU 1028 Ignatius and the Princess III 母函数 模板 or 完全背包
摘要:这题是母函数的一模板题,如果你还不知道什么叫母函数,请去网上下载卢华明,卢开澄的<组合数学>,或者去tankywoo那里把原理看懂,http://www.wutianqi.com/?p=596。里面的第二章把母函数的原理分析得很透彻,下面讲代码实现.其实下面代码就是电脑模拟人工计算,而且很有规则,是从第一个括号开始算起,先把第一个括号跟第二个括号相乘,然后这两个括号就合并了,然后又把第一个括号跟第二个括号相乘,知道n个括号全部被算出来(i 就代表第几个括号正在被合并);我想大家肯定对m2[j + k] += m1[j]很疑惑,是的,我也在这卡了很久.我开始总以为这是什么公式,结果一 阅读全文

posted @ 2011-03-26 20:44 LeeBlog 阅读(451) 评论(2) 推荐(1)