之前也有做过不过都忘记了,今日又重新来过,不过写完觉得,这也就不过是这么回事,对于母函数的应用还是比较窄的说,只要记得模板就几乎
不可能做不出来,不过前提一定是这要知道这是用母函数做啦。
这里推荐一篇文章写得很不错:母函数详解 由于太长了就不转了。
母函数就是模拟我们做多项式乘法的过程,只要明白到这点就不难理解了,不过可能刚看模板代码时会觉得有点难理解,个人觉得最好的方法是
你用笔在草纸上对着代码去算一下,这样就什么都明白了;下面是hdu 1079 的一道题,其实也可以背包问题做的说;那三个循环变量的意义是最关键的地方;
代码:
#include<iostream>
#define N 10005
#define M 10005
using namespace std;
int main()
{
int pre[M],pos[M];
int weight[N];
int noW[N];
int nWeight;
int count;
while(cin >>nWeight){
int sum = 0;
int x;
memset(pre,0,sizeof(pre));
memset(pos,0,sizeof(pos));
for(int i = 1;i <= nWeight;i++){
cin >>x;
weight[i] = x;
sum += x;
}
pre[0] = 1;
int i,j,k;
for(i = 1;i <= nWeight;i++){// 这是代表第几个多项式
for(j = 0;j <= sum;j++){//这是代表我们之前算好的前i-1个多项式的结果的第j项
for(k = 0;k+j <= sum && k <= weight[i];k += weight[i]){//这里是第i个多项式的第指数为k的那一项,这里k <= weight[i]是因为每种至多只能有一个的原因。
pos[j+k] += pre[j];
if(j >= k)
pos[j-k] += pre[j];
else
pos[k-j] += pre[j];
}
}
for(j = 0;j <= sum;j++){
pre[j] = pos[j];
pos[j] = 0;
}
}
for(i = 1,count = 0;i <= sum;i++){
if(!pre[i]){
noW[count] = i;
count++;
}
}
cout <<count <<endl;
if(count){
for(i = 0;i < count-1;i++)
cout <<noW[i] <<' ';
cout <<noW[i] <<endl;
}
}
return 0;
}