[HAOI2012] 音量调节
橙题都能卡半天
题目描述
一个吉他手准备参加一场演出。他不喜欢在演出时始终使用同一个音量,所以他决定每一首歌之前他都需要改变一次音量。在演出开始之前,他已经做好一个列表,里面写着每首歌开始之前他想要改变的音量是多少。每一次改变音量,他可以选择调高也可以调低。
音量用一个整数描述。输入文件中整数 b e g i n L e v e l beginLevel beginLevel,代表吉他刚开始的音量,整数 m a x L e v e l maxLevel maxLevel,代表吉他的最大音量。音量不能小于 0 0 0 也不能大于 m a x L e v e l maxLevel maxLevel。输入中还给定了 n n n 个整数 c 1 , c 2 , c 3 , ⋯ , c n c_1,c_2,c_3,\cdots,c_n c1,c2,c3,⋯,cn,表示在第 i i i 首歌开始之前吉他手想要改变的音量是多少。
吉他手想以最大的音量演奏最后一首歌,你的任务是找到这个最大音量是多少。
输入格式
第一行依次为三个整数 n n n, b e g i n L e v e l beginLevel beginLevel 和 m a x L e v e l maxLevel maxLevel。
第二行依次为 n n n 个整数 c 1 , c 2 , c 3 , ⋯ , c n c_1,c_2,c_3,\cdots,c_n c1,c2,c3,⋯,cn。
输出格式
输出演奏最后一首歌的最大音量。如果吉他手无法避免音量低于
0
0
0 或者高于
m
a
x
L
e
v
e
l
maxLevel
maxLevel,输出 -1
。
样例 #1
样例输入 #1
3 5 10
5 3 7
样例输出 #1
10
提示
1 ≤ n ≤ 50 1\le n\le 50 1≤n≤50, 1 ≤ c i ≤ m a x L e v e l 1\le c_i\le maxLevel 1≤ci≤maxLevel, 1 ≤ m a x L e v e l ≤ 1000 1\le maxLevel\le 1000 1≤maxLevel≤1000, 0 ≤ b e g i n L e v e l ≤ m a x L e v e l 0\le beginLevel\le maxLevel 0≤beginLevel≤maxLevel。
不会背包!?!
60pt解法:
int ans=-1;
void dfs(int u,int i){
if(u>m || u<0)return ;
if(i>n){
ans = max(ans,u);
return ;
}
dfs(u+v[i],i+1);
dfs(u-v[i],i+1);
}
void solve(){
int x;
cin>>n>>x>>m;
for(int i=1;i<=n;i++)cin>>v[i];
dfs(x,1);
cout<<ans;
}
int main(){
solve();
return 0;
}
what’up?
瞎改了下,AC了?
int f[55][1220],n,m;
/*
出问题的原因是状态设计:
f[i][j] 表示使用前i个物品,能否弹奏j音量
*/
void solve(){
int x;
cin>>n>>x>>m;
f[0][x] = 1;
for(int i=1;i<=n;i++){
int v;cin>>v;
for(int j=0;j+v<=m;j++)
f[i][j] |= f[i-1][j+v];
for(int j=m;j>=v;j--){
f[i][j] |= f[i-1][j-v];
}
}
int ans = m;
while(!f[n][ans] && ans>0 )ans--;
if(ans == 0)ans=-1;
cout<<ans;
}