我不得不说这是一道BZOJ的大水题。
一眼就可以看出的布尔型DP。
F[i][j]表示前i天能否达到j音量。
code:
#include <cstdio> #include <cctype> #define C c = tc ( ) using namespace std; inline char tc(){ static char fl[100000],*A,*B; return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++; } inline void read(int &x){ static char c; while(!isdigit(C));x=c-'0'; while(isdigit(C))x=x*10+c-'0'; } int n,bx,mx,a[51],f[51][1001]; int main(){ freopen("sounds.in","r",stdin); freopen("sounds.out","w",stdout); read(n),read(bx),read(mx); for(int i=1;i<=n;i++)read(a[i]); f[0][bx]=1; for(int i=1;i<=n;i++){ for(int j=0;j<=mx;j++){ if(j-a[i]>=0) f[i][j]|=f[i-1][j-a[i]]; if(j+a[i]<=mx)f[i][j]|=f[i-1][j+a[i]]; } } for(int i=mx;i>=0;i--) if(f[n][i]){ printf("%d",i); return 0; } puts("-1"); fclose(stdin),fclose(stdout); return 0; }
想知道fread读优怎么打的C++同志看这儿→
YZ哥哥读入优化