题目大意:给定$n$个数,第$i$个数为$a_i$,记这$n$个数的所有非空子集的和分别为$s_1,s_2,dots,s_{2^n-1}$;求$s$的中位数。
题解:假设考虑的是所有子集,包括空子集。
令$sum=sumlimits_{t=1}^n a_i$。
若有一个子集和为$x$,存在另一个子集和为$sum-x$。
因此不含空子集的中位数等价于所有出现过的数的中间两个的后一个。
$0/1$背包就好了,可以用$bitset$优化
卡点:无
C++ Code:
#include <cstdio> #include <bitset> using namespace std; int n, s, sum; bitset<2000001> v; int main() { scanf("%d", &n); v[0] = 1; for (int i = 1; i <= n; i++) { scanf("%d", &s); sum += s; v |= v << s; } for (int i = sum + 1 >> 1; i <= sum; i++) { if (v[i]) { printf("%d ", i); break; } } return 0; }