给定一个初始值 以及每次可以上调或下调的量 和最大数值 ,求出在满足 条件下的 。
入门级别的DP吧。
我们可以令 表示第 个时刻,是否可能达到 的音量。
状态转移方程很好写:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define MAXN 55
#define MAXLEVEL 1005
int c[MAXN];
bool d[MAXN][MAXLEVEL];
int main() {
int n, beginlevel, maxlevel;
scanf("%d%d%d", &n, &beginlevel, &maxlevel);
for (int i = 1; i <= n; i++)
scanf("%d", &c[i]);
d[0][beginlevel] = true;
for (int i = 1; i <= n; i++)
for (int j = 0; j <= maxlevel; j++) {
if (j - c[i] >= 0)
d[i][j] |= d[i - 1][j - c[i]];
if (j + c[i] <= maxlevel)
d[i][j] |= d[i - 1][j + c[i]];
}
for (int i = maxlevel; i >= 0; i--)
if (d[n][i]) {
printf("%d\n", i);
return 0;
}
printf("-1\n");
return 0;
}