【bzoj2748】[HAOI2012]音量调节
设F[i][j]表示在第i首歌曲结束后,音量能否刚好为j
转移:F[i][j]=F[i][j-C[i]] or F[i][j+C[i]]
初始化:F[0][beginlevel]=true
最后在所有F[N][j]中找到F[N][j]为true的且要让j尽量大。
如果所有0<=j<=maxlevel中的F[N][j]均为false,则输出-1。
#include<algorithm> #include<iostream> #include<cstdlib> #include<cstring> #include<cstdio> #include<cmath> #include<queue> using namespace std; #define N 1010 int f[N][N]; int n,b,m; int x; int main() { scanf("%d%d%d",&n,&b,&m); f[0][b]=1; for (int i=1;i<=n;i++) { scanf("%d",&x); for (int j=0;j<=m;j++) { if (j>=x) f[i][j]=f[i-1][j-x]; if (j+x<=m) f[i][j]=(f[i][j] || f[i-1][j+x]); } } for (int i=m;i>=0;i--) if (f[n][i]) { printf("%d",i); return 0; } printf("-1"); return 0; }