dp题,一碰到dp我基本就是跪,搜了网上的答案分两种,一维和二维。
先讲二维,sum[i][j]表示前i个数的subset里差值为j的分法数量。当加入数字i时,有两种选择,某一个set和另外一个set,当加入其中一个总和大的set时,新的差值为j+i,当加入一个总和小的set时,新的差值为abs(j-i)。
/* ID: yingzho1 LANG: C++ TASK: subset */ #include <iostream> #include <fstream> #include <string> #include <map> #include <vector> #include <set> #include <algorithm> #include <stdio.h> #include <queue> #include <cstring> using namespace std; ifstream fin("subset.in"); ofstream fout("subset.out"); int N, s1, s2, acount; ][]; int main() { fin >> N; sum[][] = ; ; i <= N; i++) { ; j < ; j++) { sum[i][j+i] += sum[i-][j]; sum[i][abs(j-i)] += sum[i-][j]; } } fout << sum[N][] << endl; ; }
一元的思路就是sum[i]表示总和为i的set数。
/* ID: yingzho1 LANG: C++ TASK: subset */ #include <iostream> #include <fstream> #include <string> #include <map> #include <vector> #include <set> #include <algorithm> #include <stdio.h> #include <queue> #include <cstring> using namespace std; ifstream fin("subset.in"); ofstream fout("subset.out"); int N; ]; int main() { fin >> N; )*N/; ) { fout << << endl; ; } part /= ; sum[] = ; ; i <= N; i++) { for (int j = part; j >= i; j--) { sum[j] += sum[j-i]; } } fout << sum[part]/ << endl; ; }