bzoj 2748
布尔型动态规划。
f[i][j]表示第i首歌之后,音量为j是否可行。
f[i][j]=f[i-1][j-c[i]] | f[i-1][j+c[i]]。
#include<cstdio> #include<cctype> int read(){ char c; while(!isdigit(c=getchar())); int x=c-'0'; while(isdigit(c=getchar())) x=x*10+c-'0'; return x; } int f[51][1001]; int main(){ int n=read(),bg=read(),mx=read(); f[0][bg]=1; for(int i=1;i<=n;i+=1){ int c=read(); for(int j=0;j<=mx;j+=1) if(f[i-1][j]){ if(j+c<=mx) f[i][j+c]=1; if(j-c>=0) f[i][j-c]=1; } } int ans=-1; for(int i=mx;i>=0;i--) if(f[n][i]){ans=i; break;} printf("%d",ans); return 0; }