「BZOJ 2748」音量调节 (背包)

题意:原题在这
 

有n个歌曲,每个歌曲有Mike想要调节到的音量

给定初始音量和一次能调节的最大音量,求演奏最后一首歌时的最大音量

 

做法:
 

这是我见过最水的背包...... 

 

dp[i][j]表示唱到第i首歌,音量为j的状态是否合法

 

判断一波调高或调低的时候会不会越界,不越界的话就dp一下

 

完全没有什么要注意的......  然而输出WA了好几次

 
 
代码:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 int n,bg,maxv;
 8 int vol[55];
 9 bool dp[55][1050];
10 
11 int read()
12 {
13     char ch=getchar();int x=0,f=1;
14     while(ch<'0' || ch>'9'){ if(ch=='-') f=-1; ch=getchar();}
15     while(ch>='0' && ch<='9'){ x=x*10+ch-'0'; ch=getchar();}
16     return x*f;
17 }
18 
19 int main()
20 {
21     n=read(); bg=read(); maxv=read();
22     for(int i=1;i<=n;i++) vol[i]=read();
23     dp[0][bg]=1;
24     for(int i=1;i<=n;i++)
25     {
26         for(int j=0;j<=maxv;j++)
27         {
28             if(j-vol[i]>=0)//音量调高
29                 if(dp[i-1][j-vol[i]]) dp[i][j]=1;
30             if(j+vol[i]<=maxv)//音量降低
31                 if(dp[i-1][j+vol[i]]) dp[i][j]=1;
32         }
33     }
34     for(int i=maxv;i>=0;i--)
35     {
36         if(dp[n][i])
37         {
38             cout<<i<<endl; return 0;
39         }
40     }
41     cout<<"-1"<<endl;
42     return 0;
43 }

 

 

posted @ 2018-06-14 00:17  LocaEtric  阅读(205)  评论(0编辑  收藏  举报