变音量

[问题描述]
你将要在元旦演奏一场吉他专场。但你不希望声音平淡,所以你希望每个曲之间都有变化。现在你已经确定了每个曲可以与上一个曲之间的音量的变化量,即每首曲开始,你可以对音量选择增加或减少一个指定的变化值。当然音量不可能为负数,也不能太高,因此必需保证每首曲音量在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.
posted @ 2016-11-03 16:57  猪都哭了  阅读(246)  评论(0编辑  收藏  举报