[算法设计与分析]DP 解题报告

Problem

对于由从1到N (1 <= N <= 39)这N个连续的整数组成的集合来说,我们有时可以将集合分成两个部分和相同的子集合。
例如,N=3时,可以将集合{1, 2, 3} 分为{1,2}和{3}。此时称有一种方式(即与顺序无关)。
N=7时,共有四种方式可以将集合{1, 2, 3, ..., 7} 分为两个部分和相同的子集合:
{1,6,7} 和 {2,3,4,5}
{2,5,7} 和 {1,3,4,6}
{3,4,7} 和 {1,2,5,6}
{1,2,4,7} 和 {3,5,6}
输入:程序从标准输入读入数据,只有一组测试用例。如上所述的N。
输出:方式数。若不存在这样的拆分,则输出0。

test input

7

test output

4

ac code

//
//  main.cpp
//  和相同的子集合
//
//  Created by jetviper on 2017/3/24.
//  Copyright © 2017年 awlsx. All rights reserved.
//

#include
#include 


int dp[200];

int main()
{
    for (int i=0; i<200; i++) {
        dp[i]=0;
    }
    int n;
    scanf("%d",&n);
    
    int res = n*(n+1)/2;
    
    if(res%2)
    {
        printf("0\n");
        return 0;
    }
    res/=2;
   
    dp[0]=1;
    
    for(int i=1;i<=n;i++)
        for(int j=res;j>=i;j--)dp[j]+=dp[j-i];////dp[j]表示加起来等于j的组数
    

    printf("%d\n",dp[res]/2);
    return 0;
}

你可能感兴趣的:([算法设计与分析]DP 解题报告)