母函数就这么点事儿(hdu 1079)

   之前也有做过不过都忘记了,今日又重新来过,不过写完觉得,这也就不过是这么回事,对于母函数的应用还是比较窄的说,只要记得模板就几乎

不可能做不出来,不过前提一定是这要知道这是用母函数做啦。

   这里推荐一篇文章写得很不错:母函数详解  由于太长了就不转了。

母函数就是模拟我们做多项式乘法的过程,只要明白到这点就不难理解了,不过可能刚看模板代码时会觉得有点难理解,个人觉得最好的方法是

你用笔在草纸上对着代码去算一下,这样就什么都明白了;下面是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;
}


你可能感兴趣的:(母函数就这么点事儿(hdu 1079))