码迷,mamicode.com
首页 > 其他好文 > 详细

扩展的母函数

时间:2015-04-22 07:03:38      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

nows nowe 分别代表 正数范围上的 nowe代表负数范围上的。

nexts nexte 同理。

也就是用新的nowe nexte 存储负数的结果即可。扩展到负数域。这样就可以做减法的母函数的题目啦。

注意这个时候物品可以是负数的。负数的话就存在nowe nexte上即可。 

技术分享
#include<stdio.h>
#include<string.h>
#include<math.h>
int main()
{
    int n;
    int nows[1000];
    int nowe[1000];

    int nexts[1000];
    int nexte[1000];
    int val[10];
    int i,j,k;
    int sum;
    while(scanf("%d",&n)!=EOF)
    {
        memset(nows,0,sizeof(nows));
        memset(nowe,0,sizeof(nowe));
        memset(nexts,0,sizeof(nexts));
        memset(nexte,0,sizeof(nexte));
        sum = 0;
        for(i=0;i<n;i++){scanf("%d",&val[i]);sum+=val[i];}
        //init .
        nows[0] = 1;
        nows[val[0]] =1;
        nowe[val[0]] =1; 
        
        for(i=1;i<n;i++)
        {
            for(j=-sum;j<=sum;j++)  //对于每一个值
            {
                for(k=-1;k<=1;k++)
                {
                    if(j<0)
                    {
                        if(j+k*val[i]>=0){ nexts[j+k*val[i]] += nowe[-j];}
                        else{nexte[-(j+k*val[i])] += nowe[-j]; }
                    }
                    else
                    {
                        if(j+k*val[i]>=0){nexts[j+k*val[i]] += nows[j];}
                        else{nexte[-(j+k*val[i])] += nows[j]; }
                    }

                }
            }
            memcpy(nows,nexts,sizeof(nexts));
            memcpy(nowe,nexte,sizeof(nexte));
            memset(nexts,0,sizeof(nexts));
            memset(nexte,0,sizeof(nexte));
        }

        for(i=0;i<=sum;i++)
        {
            printf("%d:%d ",i,nows[i]);
        }
        
    }
    
}
View Code

想到了减法。那么乘法 很简单。除法则是要扩展到分数。。我觉得应该可以用map来实现吧。其实负数也可以直接用map来实现的。这个解法只是个人无聊之作啦。

扩展的母函数

标签:

原文地址:http://www.cnblogs.com/Milkor/p/4446133.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!