一个放在普及组都不为过的超级大水题。
一眼就看出来是线性dp, 定义f[i][j]为第i首歌是否可以以音量为j唱。
方程比较简单,略。
dp用刷表法比较方便。
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1005;
bool f[55][maxn];
int n, be, ma;
int c[55];
void dp() {
memset(f, 0, sizeof(f));
f[0][be] = true;
for(int i = 0; i < n; i++) {
for(int j = 0; j <= ma; j++) {
if(f[i][j]) {
if(j+c[i+1] <= ma) f[i+1][j+c[i+1]] = true;
if(j-c[i+1] >= 0) f[i+1][j-c[i+1]] = true;
}
}
}
}
int main() {
scanf("%d %d %d", &n, &be, &ma);
for(int i = 1; i <= n; i++) {
scanf("%d", &c[i]);
}
dp();
for(int i = ma; i >= 0; i--) {
if(f[n][i]) {
printf("%d", i);
return 0;
}
}
printf("%d", -1);
}