题意:给定B,U和数组c,求在不超过U的情况下,从c中选择部分元素*(1或-1)使得B+所选元素之和最大
题解:太水不想说什么了- -,f[i][j]记录第i个歌曲能否到达音量j
#include <cstdio> #include <cstring> #include <cstdlib> #include <iostream> #include <algorithm> using namespace std; const int MAXN=50+2; const int MAXL=1000+2; int c[MAXN],N,beginlevel,maxlevel; bool f[MAXN][MAXL]; int main(){ cin >> N >> beginlevel >> maxlevel; for(int i=1;i<=N;i++) cin >> c[i]; f[0][beginlevel]=1; for(int i=1;i<=N;i++) for(int j=0;j<=maxlevel;j++){ if(j+c[i]<=maxlevel && f[i-1][j+c[i]]) f[i][j]=1; if(j-c[i]>=0 && f[i-1][j-c[i]]) f[i][j]=1; } for(int i=maxlevel;i;i--) if(f[N][i]){ cout << i << endl; return 0; } cout << -1 << endl; return 0; }