1 条题解

  • 0
    @ 2024-12-24 9:48:48

    C++ :

    #include<iostream>
    #include<malloc.h>
    using namespace std;
    long long  dyn[1000]={0};
    int main()
    {
     int n,s;
    while(scanf("%d",&n)!=EOF){
     s=n*(n+1);
     if(s%4)
     {
      cout<<0<<endl;
      continue;
     }
     s/=4;
     int i,j;
     dyn[0]=1;
     for(i=1;i<=n;i++)//表示这个次选取的是数为i
     {
      for(j=s;j>=i;j--)
       dyn[j]+=dyn[j-i];//dyn[j-i]表示加起来等于j-i的组数,
     }                        //dyn[j]表示加起来等于j的组数 
     cout<<dyn[s]/2<<endl;//由于交换两个子集合的位置被认为是同一种划分方案,所以最终结果为dyn[s]/2
    for(int i=1;i<=dyn[s]/2;i++)
    	dyn[i]=0;
    }
     return 1;
    }
    
    • 1

    信息

    ID
    697
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者