CFR 688 E. The Values You Can Make ( DP )
Problem - E - Codeforces
dp[ i ][ j ][ k ]: possible or not to make value k, out of a set with sum j, examining the first i coins in the array.
dp[ i ][ j ][ k ] = dp[ i - 1 ][ j ][ k ] or dp[ i - 1 ][ j - C[ i ] ][ k ] or dp[ i - 1 ][ j - C[ i ] ][ k - C[ i ] ]
void solve(){ int N, K; cin >> N >> K; vi C( N ); for( int i = 0; i < N; ++i ) cin >> C[ i ]; vector< vvi > dp( 2, vvi( 501, vi( 501 ) ) ); int _t = 0; dp[ _t ][ 0 ][ 0 ] = 1; for( int i = 0; i < N; ++i, _t ^= 1 ) for( int j = 0; j <= K; ++j ) for( int k = 0; k <= K; ++k ){ if( dp[ _t ][ j ][ k ] == 0 ) continue; dp[ _t ^ 1 ][ j ][ k ] = 1; if( C[ i ] + j <= K ){ dp[ _t ^ 1 ][ C[ i ] + j ][ k ] = 1; if( C[ i ] + k <= K ) dp[ _t ^ 1 ][ C[ i ] + j ][ C[ i ] + k ] = 1; } } vi ans; for( int i = 0; i <= K; ++i ) if( dp[ _t ][ K ][ i ] ) ans.push_back( i ); cout << ans.size() << "\n"; for( int i = 0; i < ans.size(); ++i ) cout << ans[ i ] << ( i + 1 == ans.size() ? '\n' : ' ' ); }