1. 程式人生 > >計蒜客————等和的分隔子集

計蒜客————等和的分隔子集

  •  23.89%
  •  1000ms
  •  65536K

曉萌希望將1到N的連續整陣列成的集合劃分成兩個子集合,且保證每個集合的數字和是相等。例如,對於N=3,對應的集合{1,2,3}能被劃分成{3} 和 {1,2}兩個子集合.

這兩個子集合中元素分別的和是相等的。

對於N=3,我們只有一種劃分方法,而對於N=7時,我們將有4種劃分的方案。

輸入包括一行,僅一個整數,表示N的值(1≤N≤39)。

輸出包括一行,僅一個整數,曉萌可以劃分對應N的集合的方案的個數。當沒發劃分時,輸出0。

樣例輸入

7

樣例輸出

4
dp,以數為層.
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

int main() {
    int n;
    while(~scanf("%d",&n)) {
        long long map[45][800]= {},sum=n*(n+1)/2;
        if(sum&1) {
            printf("0\n");
            continue;
        }
        for(int i=1; i<=n; i++) {
            map[i][i]+=1;
            for(int j=i+1; j<=sum/2; j++)
                map[i][j]+=map[i-1][j-i];
            for(int j=1; j<=sum/2; j++)
                map[i][j]+=map[i-1][j];
        }
        printf("%lld\n",map[n][sum/2]/2);
    }
    return 0;
}