AT3857 [AGC020C] Median Sum
https://www.luogu.com.cn/problem/AT3857
首先发现假设和为
s
s
s
如果存在和为
x
x
x的子集,那么一定存在和为
s
−
x
s-x
s−x的子集
那么肯定是对称的
所以中位数一定是
(
s
+
1
)
/
2
(s+1)/2
(s+1)/2往上找
那么只需要用
b
i
t
s
e
t
bitset
bitset跑一遍背包看看每个数是否能被取到
第一个
>
=
(
s
+
1
)
/
2
>=(s+1)/2
>=(s+1)/2的能被取到的数就是答案
code:
#include<bits/stdc++.h>
#define N 4000050
using namespace std;
int n;
bitset<N> f;
int main() {
scanf("%d", &n);
f[0] = 1; int s = 0;
for(int i = 1; i <= n; i ++) {
int x;
scanf("%d", &x);
f |= f << x; s += x;
}
for(int i = (s + 1) / 2; i <= s; i ++) if(f[i]) {printf("%d", i); return 0;}
return 0;
}