题目:http://www.lydsy.com/JudgeOnline/problem.php?id=2748
额。。。裸裸的DP,直接推一次就好了额。。。
代码:
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std ;
const int maxn = 51 , maxl = 1010 ;
bool f[ maxn ][ maxl ] ;
int n , bl , ml , c[ maxn ] ;
int main( ) {
scanf( "%d%d%d" , &n , &bl , &ml ) ;
for ( int i = 0 ; i ++ < n ; ) scanf( "%d" , c + i ) ;
memset( f , false , sizeof( f ) ) ;
f[ 0 ][ bl ] = true ;
for ( int i = 0 ; i ++ < n ; ) {
for ( int j = 0 ; j <= ml ; ++ j ) if ( f[ i - 1 ][ j ] ) {
if ( j - c[ i ] >= 0 ) f[ i ][ j - c[ i ] ] = true ;
if ( j + c[ i ] <= ml ) f[ i ][ j + c[ i ] ] = true ;
}
}
for ( int i = ml ; i >= 0 ; -- i ) if ( f[ n ][ i ] ) {
printf( "%d\n" , i ) ;
return 0 ;
}
printf( "-1\n" ) ;
return 0 ;
}