方法1
到达型dp.
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 1e3 + 10;
int n, bg, mx;
int a[N];
int f[N][N];
int main(){
cin >> n >> bg >> mx;
for(int i = 1; i <= n; i++) cin >> a[i];
f[0][bg] = 1;
for(int i = 1; i <= n; i++){
for(int j = mx; j >= 0; j--){
if(f[i-1][j] && j - a[i] >= 0){
f[i][j-a[i]] = 1;
}
if(f[i-1][j] && j + a[i] <= mx){
f[i][j+a[i]] = 1;
}
}
}
for(int i = mx; i >= 0; i--){
if(f[n][i]){
cout << i << endl;
return 0;
}
}
puts("-1");
// cout << f[mx] << endl;
return 0;
}
方法2(微变型)
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N = 2e3 + 10;//数据范围若为1000则wa三个点。
//mx + mx = 2mx;
int n, bg, mx;
int a[N];
int f[N][N];
int main(){
cin >> n >> bg >> mx;
for(int i = 1; i <= n; i++) cin >> a[i];
f[0][bg] = 1;
for(int i = 1; i <= n; i++){
for(int j = 0; j <= mx; j++){
if(f[i-1][j]){
f[i][j + a[i]] = 1;
f[i][j - a[i]] = 1;
}
}
}
for(int i = mx; i; i--){
if(f[n][i]){
cout << i << endl;
return 0;
}
}
puts("-1");
// cout << f[mx] << endl;
return 0;
}