记
s
u
m
sum
sum为所有数的和,注意到对于任意一个集合,它和它的补集关于
s
u
m
2
\frac{sum}{2}
2sum对称,所以答案就是大于等于
s
u
m
2
\frac{sum}{2}
2sum的第一个可能作为子集和的数
用bitset求即可
Code:
#include<bits/stdc++.h>
using namespace std;
inline int read(){
int res=0,f=1;char ch=getchar();
while(!isdigit(ch)) {if(ch=='-') f=-f;ch=getchar();}
while(isdigit(ch)) {res=(res<<1)+(res<<3)+(ch^48);ch=getchar();}
return res*f;
}
bitset<4000005>a;
int n,sum=0;
inline void file(){freopen("a.in","r",stdin);freopen("a.out","w",stdout);}
int main(){
n=read();a[0]=1;
for(int i=1,x;i<=n;i++) sum+=(x=read()),a|=(a<<x);
for(int i=sum+1>>1;i<=sum;i++) if(a[i]) {cout<<i;return 0;}
return 0;
}