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