[问题描述]
你将要在元旦演奏一场吉他专场。但你不希望声音平淡,所以你希望每个曲之间都有变化。现在你已经确定了每个曲可以与上一个曲之间的音量的变化量,即每首曲开始,你可以对音量选择增加或减少一个指定的变化值。当然音量不可能为负数,也不能太高,因此必需保证每首曲音量在0和maxLevel之间(包含)。
你的任务是,根据已有的开始音量beginLevel 和每首曲之间的变化量,求出最后一首曲的最大可能音量。如果没有方案,输出 -1。
[输入文件:song.in]
文件第一行有三个整数,n, beginLevel, maxLevel,分别表示曲目数,开始量,最大限制音量。
下面有n-1行整数,第i行整数表示第i首曲与第i+1首曲之间的变化量。
[输入文件:song.in]
文件只一行一个数,答案。
[题解]
判定性DP.
[代码]
var
f:array[0..100,-2000..2000] of boolean;
n,start,max,i,j,jj:longint;
a:array[0..100] of longint;
begin
assign(input,'song.in');
assign(output,'song.out');
reset(input);
rewrite(output);
readln(n,start,max);
for i:=1 to n-1 do
readln(a[i+1]);
fillchar(f,sizeof(f),false);
f[1,start]:=true;
for i:=2 to n do
for j:=0 to max do
begin
if j-a[i]>=0 then
f[i,j]:=f[i-1,j-a[i]];
if j+a[i]<=max then
f[i,j]:=f[i,j] or f[i-1,j+a[i]];
end;
jj:=-1;
for j:=max downto 0 do
if f[n,j] then
begin
jj:=j;
break;
end;
writeln(jj);
close(input);
close(output);
end.