把有加有减转换为全加,形成01背包
只得了10pts
//P1877
#include <iostream>
#include <cstdio>
int n,bl,ml,v[1010],dp[1010],minv=2147483647,sumv,V;
int main(){
scanf("%d%d%d",&n,&bl,&ml);
for(int i=1; i<=n; ++i){
scanf("%d",&v[i]);
minv=std::min(minv,v[i]),sumv+=v[i],v[i]<<=1;
}
V=ml+sumv-bl,minv<<=1,sumv<<=1;
if(minv>V||sumv<V) return puts("-1")&0;
for(int i=1; i<=n; ++i)
for(int j=V; j>=v[i]; --j)
dp[j]=std::max(dp[j],dp[j-v[i]]+v[i]);
printf("%d",dp[V]>>1);
return 0;
}