HDOJ1709特殊的母函数

来源:互联网 发布:一键系统还原软件 编辑:程序博客网 时间:2024/06/11 11:44
#include <iostream>using namespace std;static const int lmax = 100000;static int n;static int C1[lmax],C2[lmax];static int a[105];int main(){while(~scanf("%d",&n)){int sums = 0;for (int i=1;i<=n;++i){ scanf("%d",&a[i]); sums+=a[i];}memset(C2,0,sizeof(C2));memset(C1,0,sizeof(C1));C1[0] = 1;C1[a[1]] = 1;for (int i=2;i<=n;++i){for (int j=0;j<=sums;++j){if (C2[j]==0)C2[j] += C1[j];if (j+a[i]<=sums&&C2[j+a[i]]==0)C2[j+a[i]]+=C1[j];if (j-a[i]>0&&C2[j-a[i]]==0)C2[j-a[i]]+=C1[j];if (a[i]-j>0&&C2[a[i]-j]==0)C2[a[i]-j]+=C1[j];}for (int j=0;j<=sums;++j){C1[j] = C2[j];C2[j] = 0;}}int ans[lmax];int cnt = 0;for (int i=1;i<=sums;++i){if (C1[i]==0) ans[cnt++] = i;}if (cnt==0) printf("0\n");else{printf("%d\n",cnt);for (int i=0;i<cnt-1;++i) printf("%d ",ans[i]);printf("%d\n",ans[cnt-1]);}}return 0;}

0 0