一道google面试题(dp)

输入n,把1-n分成两个和相等的子集,有多少种分法

想了个dp,直接背包也行

#include <iostream>
#include <cstdio>

using namespace std;

int dp[55];

int main()
{
int n;
scanf("%d", &n);
int s = n * (n + 1) / 2;
if(s & 1) {//如果s为奇数,则不可能分成相等的两份
puts("0");
return 0;
}
s >>= 1;
dp[0] = 1;//表示s等于0的时候,方法数为1
for(int j = 1; j <= n; j++)
for(int i = s; i >= j; i--)
dp[i] += dp[i-j];
printf("%d\n", dp[s] >> 1);
return 0;
}

 

posted on 2017-07-07 10:23  alex5211314  阅读(217)  评论(0编辑  收藏  举报

导航