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

来源:互联网 发布:百度seo是什么 编辑:程序博客网 时间:2024/05/17 23:45

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

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

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

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

你用笔在草纸上对着代码去算一下,这样就什么都明白了;下面是hdu 1079 的一道题,其实也可以背包问题做的说;那三个循环变量的意义是最关键的地方;

代码:

#include<iostream>#define N 10005#define M 10005using 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];elsepos[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;}