很早就知道母函数,但是没有真正做过题,今天接触了母函数,有了一点了解,做的这两道题都可以用背包来解决。不知道母函数解决问题和背包有什么关系。
//HDOJ_1398 Square Coins
//G(x)=(1+x+x^2+x^3+x^4+…)(1+x^4+x^8+x^12+…)(1+x^9+x^18+x^27+…)…
#include <iostream>
using namespace std;
const int lmax=300;
int c1[lmax+1],c2[lmax+1];
int main(void)
{ int n,i,j,k;
while (cin>>n &&n)
{ for (i=0;i<=n;i++)
{
c1[i]=1;
c2[i]=0;
}// 对c1初始化,由第一个表达式(1+x+x2+..x^17)初始化,把质量从0到17的所有硬币个数都初始
for (i=2;i<=17;i++) // i从2到n遍历,一次模拟手工打开括号,从第二个到低17个括号
{ for (j=0;j<=n;j++)//3j 从0到n遍历,这里j就是里第j个变量的系数
for (k=0;k+j<=n;k+=i*i)//4k表示的是第j个指数,所以k每次增i*i
{ c2[j+k]+=c1[j]; }
for (j=0;j<=n;j++)//5为打开下一个括号准备
{ c1[j]=c2[j]; c2[j]=0; }
}
cout<<c1[n]<<endl;
}
return 0;
}
//HDOJ1085
//G(x)=(1+x+x^2+...+x^a)*(1+x^2+x^4...+x^2b)*(1+x^5+x^10+...+x^5c)
#include<stdio.h>
#define N 150
int a[N+1],b[N+1];
void solve()
{
int i,j,k;
for(i=0;i<=N;i++)
{
a[i]=1;
b[i]=0;
}
for(i=2;i<=N;i++)
{
for(j=0;j<=N;j++)
for(k=0;k+j<=N;k+=i)
{
b[j+k]+=a[j];
}
for(j=0;j<=N;j++)
{
a[j]=b[j];
b[j]=0;
}
}
/*for(i=0;i<=20;i++)
printf("%d ",a[i]);*/
return ;
}
int main()
{
int n;
solve();
while(scanf("%d",&n)!=EOF)
{
printf("%d\n",a[n]);
}
return 0;
}母函数
最新推荐文章于 2025-01-09 22:50:25 发布
本文探讨了母函数在解决特定类型问题时与背包问题之间的联系。通过具体实例HDOJ_1398SquareCoins和HDOJ1085,展示了母函数如何简化问题求解过程,提供了解决方案的思路。
810

被折叠的 条评论
为什么被折叠?



