一道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) 编辑 收藏 举报