题目描述
你将要在元旦演奏一场吉他专场。但你不希望声音平淡,所以你希望每个曲之间都有变化。现在你已经确定了每个曲可以与上一个曲之间的音量的变化量,即每首曲开始,你可以对音量选择增加或减少一个指定的变化值。当然音量不可能为负数,也不能太高,因此必需保证每首曲音量在0和maxLevel之间(包含)。 你的任务是,根据已有的开始音量beginLevel 和每首曲之间的变化量,求出最后一首曲的最大可能音量。如果没有方案,输出 -1。
输入格式
文件第一行有三个整数,n, beginLevel, maxLevel,分别表示曲目数,开始量,最大限制音量。 下面有n-1行整数,第i行整数表示第i首曲与第i+1首曲之间的变化量。
输出格式
文件只一行一个数,答案。
输入样例
4 5 10
5
3
7
输出样例
10
数据范围与提示
1<=n<=60; 1<= maxLevel <=1000 0<= beginLevel <= maxLevel
#include<bits/stdc++.h>
using namespace std;
int n,s,l;
int a[70];
bool f[120][2001];
int main()
{
cin >> n >> s >> l;
for(int i = 2;i <= n; i++) scanf("%d",&a[i]);
memset(f,0,sizeof(f));
f[1][s] = 1;
for(int i = 2; i <= n; i++)
{
for(int j = 0; j <= l; j++)
{
f[i][j] = (j - a[i] >= 0 && f[i-1][j - a[i]]) || (j+a[i] <= l && f[i-1][j+a[i]]);
}
}
int ans = -1;
for(int i = l; i >= 0; i--)
{
if(f[n][i] == 1)
{
ans = i;
break;
}
}
cout << ans << endl;
}