BZOJ 2748 音量调节

题意

吉他有一个初始音量,吉他手每弹奏一首歌曲,都要将音量改变ci,可加可减,但音量不能小于0,也不能高于max。求最后一首歌曲音量最大值。无解(无法避免音量超出范围)输出-1。

数据范围

$$歌曲数n\leq50\ \ \ ;\ \ \ ci\leq max\ \ \ ;\ \ \ 初始值begin,max\leq1000$$

题解

数据如此之小……
v[i][j]表示第i首歌时音量j是否能达到,只要v[i-1][j-a[i]]和v[i-1][j+a[i]]有一个是true就行。
无力吐槽这是省选题……

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<cstdio>
bool v[60][1010];
int main()
{
int n,b,m,a,i;
scanf("%d%d%d",&n,&b,&m);
v[0][b]=1;
for (int i=1;i<=n;i++)
{
scanf("%d",&a);
for (int j=0;j<=m;j++)
v[i][j]=(j-a>=0&&v[i-1][j-a])||(j+a<=m&&v[i-1][j+a]);
}
for (i=m;i>=0;i--) if (v[n][i]) break;
printf("%d",i);
return 0;
}