Pagini recente » Cod sursa (job #344835) | Cod sursa (job #745015) | Cod sursa (job #68991) | Cod sursa (job #1404054) | Cod sursa (job #51121)
Cod sursa(job #51121)
#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] );
}