「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 }