母函数 入门习题
Posted SovietPower
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了母函数 入门习题相关的知识,希望对你有一定的参考价值。
HDU.1028.Ignatius and the Princess III(母函数)
//0MS 1500K
//母函数。。背包、DP都行。。
#include <cstdio>
#include <cstring>
typedef long long LL;
const int N=122;
int n,f[N],tmp[N];
int main()
{
while(~scanf("%d",&n))
{
memset(f,0,sizeof f), f[0]=1;//or 离线,对n排序。
for(int i=1; i<=n; ++i) f[i]=1;
for(int i=2; i<=n; ++i)
{
memset(tmp,0,sizeof tmp);
for(int j=0; j<=n; ++j)
for(int k=0; j+k<=n; k+=i)
tmp[j+k]+=f[j];
memcpy(f,tmp,sizeof f);
}
printf("%d\n",f[n]);
}
return 0;
}
HDU.1398.Square Coins(母函数)
//0MS 1512K
#include <cstdio>
#include <cstring>
const int N=303;
int n,f[N],tmp[N]; //平方数。。实际方案数也不是那么多。
void Init()
{
n=300;//N=300不是17*17。。
for(int i=0; i<=n; ++i) f[i]=1;
for(int i=2; i<=17; ++i)
{
memset(tmp,0,sizeof tmp);
for(int j=0; j<=n; ++j)
for(int k=0; j+k<=n; k+=i*i)
tmp[j+k]+=f[j];
memcpy(f,tmp,sizeof f);
}
}
int main()
{
Init();
while(scanf("%d",&n),n) printf("%d\n",f[n]);
return 0;
}
HDU.1085.Holding Bin-Laden Captive!(母函数)
//46MS 1572K
#include <cstdio>
#include <cstring>
#include <algorithm>
const int N=8008,v[5]={0,1,2,5};
int n,f[N],tmp[N],num[5];
int main()
{
while(scanf("%d%d%d",&num[1],&num[2],&num[3]),num[1]||num[2]||num[3])
{
n=1*num[1]+2*num[2]+5*num[3];
memset(f,0,sizeof f), f[0]=1;
for(int las=0,nxt,i=1; i<=3; ++i)
{
memset(tmp,0,sizeof tmp), nxt=std::min(las+v[i]*num[i],n);
for(int j=0; j<=las; ++j)
for(int k=0; k<=num[i]/*&&j+k*v[i]<=nxt*/; ++k)
tmp[j+k*v[i]]+=f[j];
memcpy(f,tmp,sizeof f), las=nxt;
}
bool flag=1;
for(int i=1; i<=n; ++i)
if(!f[i]) {printf("%d\n",i), flag=0; break;}
if(flag) printf("%d\n",n+1);
}
return 0;
}
以上是关于母函数 入门习题的主要内容,如果未能解决你的问题,请参考以下文章