变音量

来源:互联网 发布:陶哲轩现状 知乎 编辑:程序博客网 时间:2024/04/26 20:08

[问题描述]
你将要在元旦演奏一场吉他专场。但你不希望声音平淡,所以你希望每个曲之间都有变化。现在你已经确定了每个曲可以与上一个曲之间的音量的变化量,即每首曲开始,你可以对音量选择增加或减少一个指定的变化值。当然音量不可能为负数,也不能太高,因此必需保证每首曲音量在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.
0 0
原创粉丝点击