[算法设计与分析]DP 解题报告
2018-06-17 本文已影响53人
vouv
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<iostream>
#include <stdio.h>
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;
}