Cod sursa(job #51121)

Utilizator cos_minBondane Cosmin cos_min Data 10 aprilie 2007 10:49:48
Problema Oite Scor 30
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.52 kb
#include <stdio.h>
#include <fstream>
#include <vector>
using namespace std;

#define in "oite.in"
#define out "oite.out"
#define dim 1000001

int A[4][dim];
int B[4][dim];
vector< vector<int> > Q;
int N, L;
int C[1025];

int main()
{
    int max;
    freopen(in,"r",stdin);
    freopen(out,"w",stdout);
    
    scanf("%d%d", &N, &L);
    for ( int i = 1; i <= N; i++ )
        scanf("%d", &C[i]);
    
    Q.resize(4);
    
    A[0][C[1]] = 1;
    Q[0].push_back(C[1]);
    
    for ( int i = 2; i <= N; i++ )
    {
        if ( i == 2 ) max = 0;
        else if ( i == 3 ) max = 1;  
        else if ( i > 3 ) max = 2;
        
        for ( int j = 0; j <= max; j++ )
        {
            for ( int k = 0; k < Q[j].size(); k++ )
            {
                int p = Q[j][k];
                if ( p+C[i] <= L && A[j][p] != 0 )
                {
                     B[j+1][p+C[i]] = A[j+1][p+C[i]] + A[j][p];
                     if ( A[j+1][p+C[i]] == 0 ) Q[j+1].push_back(p+C[i]);
                }
            }
        }
        
        for ( int j = 0; j <= 3; j++ )
        {
            for ( int k = 0; k <= L; k++ )
            {
                if ( B[j][k] != 0 ) A[j][k] = B[j][k];
            }
        }
        
        A[0][C[i]] += 1;
        Q[0].push_back(C[i]);
    }
    
   /* for ( int i = 0; i <= 3; i++, printf("\n") )
    {
       // for ( int j = 0; j <= L; j++ )
            printf("%d ", Q[i].size());
    }   */ 
    
    printf("%d", A[3][L] );
}