0w1

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' : ' ' );
}