题目链接:传送门
题目大意:
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 c c 1 1 1、 c c c 2 2 2 . . . . . . ...... ...... c c c n n n,每次可以选择增大 c c c i i i的音量或者减少相应音量,问最后一次后最大音量为多少,若只能小于 0 0 0或者大于 m a x l e v e l maxlevel maxlevel则输出 − 1 -1 −1。。。。。
解题思路:
都说是脑残题,确实是脑残题,用背包暴力一下就行了。每个数遍历一遍背包大小,增加或者减小若在范围内就加到dp里,最后输出最后一个数的最大背包大小即可。
代码思路:
遍历每个数,顺序判断背包大小加上或者减去音量时的情况。起始 d p [ 0 ] [ s t ] = 1 dp[0][st]=1 dp[0][st]=1
核心:脑残、脑残、脑残,但对于新手来说十个不错的理解题,脑残
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n, m, st;
int w[55];
int dp[55][1005];
int main() {
scanf("%d%d%d", &n, &st, &m);
for(int i=1; i<=n; i++)
scanf("%d", &w[i]);
memset(dp, 0, sizeof(dp));
dp[0][st]=1;
for(int i=1; i<=n; i++)
for(int j=0; j<=m; j++) { //注意是逆序、逆序、逆序!!
if(j-w[i]>=0) dp[i][j] = max(dp[i][j], dp[i-1][j-w[i]]);
if(j+w[i]<=m) dp[i][j] = max(dp[i][j], dp[i-1][j+w[i]]);
}
for(int i=m; i>=0; i--)
if(dp[n][i]) {
printf("%d\n", i);
return 0;
}
printf("-1\n");
}