母函数--模板(未完成)

学习

题目:Holding Bin-Laden Captive!塔神的钱包

先写一下自己的母函数模板:

以货币问题为例:sum表示货币的钟数,数组n表示每种货币的个数,数组v表示每种货币的面值。

在调用这个函数前必须令c1,c2中元素的值为0;

View Code
const int MAXN=10005;
int c1[MAXN], c2[MAXN]; //c1存放目前所有函数的乘积, c2存放两个函数的临时乘积
int maxn;
void genfun(int sum, int *n, int *v)
{
int i, j, cnt=0;
maxn
=n[0]*v[0]; //存放当前x的最大次数,相当于x^maxn
for (i=0; i<=n[0]; i+=v[0]) //计算第一个子函数。
{
c1[i]
=1;
}
for (cnt=1; cnt<sum; cnt++) //计算其它的子函数
{
maxn
+=n[cnt]*v[cnt];
for (i=0; i<=maxn; i++) //计算两个函数的乘积
{
for (j=0; j<=n[cnt]*v[cnt]; j+=v[cnt])
{
c2[i
+j]+=c1[i];
}
}
for (i=0; i<=maxn; i++)
{
c1[i]
=c2[i];
c2[i]
=0;
}
}
}

再写一下浙江大学的“布尔母函数”模板:

View Code
//布尔母函数
//判m[]个价值为w[]的货币能否构成value
//适合m[]较大w[]较小的情况
//返回布尔量
//传入货币种数n,个数m[],价值w[]和目标值value
#define MAXV 100000

int genfunc(int n,int* m,int* w,int value){
int i,j,k,c;
char r[MAXV];
for (r[0]=i=1;i<=value;r[i++]=0);
for (i=0;i<n;i++){
for (j=0;j<w[i];j++){
c
=m[i]*r[k=j];
while ((k+=w[i])<=value)
if (r[k])
c
=m[i];
else if (c)
r[k]
=1,c--;
if (r[value])
return 1;
}
}
return 0;
}
posted on 2011-04-25 16:27  tzc_yujunyong  阅读(173)  评论(0)    收藏  举报