1051 [HAOI2012]音量调节 装箱问题变式
链接:https://ac.nowcoder.com/acm/problem/19990
来源:牛客网
题目描述
输入描述:
输出描述:
输出演奏最后一首歌的最大音量。如果吉他手无法避免音量低于0或者高于maxLevel,输出-1。
备注:
1≤n≤50,1≤ci≤maxLevel,1≤maxLevel≤1000,0≤beginLevel≤maxLevel1≤n≤50,1\le c_i\le maxLevel,1\le maxLevel\le 1000,0\le beginLevel\le maxLevel1≤n≤50,1≤ci≤maxLevel,1≤maxLevel≤1000,0≤beginLevel≤maxLevel。
分析
依旧是装箱问题,不过这题每个音量都要选,并且要么调高这个音量,要么降低这个音量。
由于每个音量都要选,并且看最后音量,所以有了次序性,数组不能把数量的那一维压缩掉
设dp[i][j] 表示选择了i个音量,最后是否有 j 这么大的音量
状态转移:if(dp[i-1][j]) dp[i][j+a[i] = 1,dp[i][j-a[i]] = 1;
可以用滚动数组优化
//-------------------------代码----------------------------
//#define int ll
const int N = 3000;
int n,m,s;
int a[N];
int f[100][N];
void solve()
{
cin>>n>>s>>m;
fo(i,1,n) {
cin>>a[i];
}
f[0][s] = 1;
fo(i,1,n) {
fo(j,0,m) {
if(f[i-1][j]) {
if(j-a[i]>=0)f[i][j-a[i]] = 1;
f[i][j+a[i]] = 1;
}
}
}
of(i,m,1) {
if(f[n][i]) {
cout<<i<<endl;
rt;
}
}
None;
}
signed main(){
clapping();TLE;
// int t;cin>>t;while(t -- )
solve();
// {solve(); }
return 0;
}
/*样例区
*/
//------------------------------------------------------------