正题
luogu 1466
题目大意
给你1~n的一个集合,问你有多少种方案把该集合分成两个集合,且两集合的数字之和相等
解题思路
设fi,jf_{i,j}fi,j为放好i个数且集合1的和比集合2的和大j的方案书
那么对于第i个放到两个集合中,分别从fi−1,j−aif_{i-1,j-a_i}fi−1,j−ai和fi−1,j+aif_{i-1,j+a_i}fi−1,j+ai转移过来
代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll n, f[50][2021];
int main()
{scanf("%lld", &n);f[0][1000] = 1;for (ll i = 1; i <= n; ++i)for (ll j = 100; j <= 1900; ++j)f[i][j] = f[i - 1][j - i] + f[i - 1][j + i];printf("%lld", f[n][1000] / 2);//两个集合调过来也算了,所以除以2return 0;
}