当前位置: 代码迷 >> 综合 >> 洛谷1466 集合Subset Sums(dp)
  详细解决方案

洛谷1466 集合Subset Sums(dp)

热度:25   发布时间:2023-12-23 11:08:34.0

 

dp经典类型之一

sum = (N + 1) * N / 2;

sum为奇数pass;sum为偶数,求和为sum / 2的方案数(貌似曾经见过类似 / 2类型的dp,思路巧妙)

注意最后结果还需要除以2,因为对称嘛

附上代码(倒数第二个测评点WA了几次...后来改long long过了......觉得N <= 40方案数不至于那么大...以后组合问题尽可能开大一些) 

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 2000;ll dp[maxn];
int N;int main()
{cin >> N;dp[0] = 1;int sum = (N + 1) * N / 2;if(sum & 1){cout << "0" << endl;return 0;}for(int i = 1; i <= N; i++){for(int j = sum / 2; j >= i; j--){if(dp[j - i])   dp[j] += dp[j - i];}}cout << dp[sum / 2] / 2 << endl;return 0;
}