#include <fstream>
using namespace std;
ifstream fin("zebughil.in");
ofstream fout("zebughil.out");
const int Nmax = 17;
int v[Nmax], dp[1 << Nmax][Nmax + 1];
int main()
{
int t = 3;
while (t-- )
{
int n, g;
fin >> n >> g;
int i, j;
for ( i = 0; i < n; ++i )
fin >> v[i];
for( int mask = 0; mask < (1 << n); ++mask )
for ( int ture = 0; ture <= n; ++ture )
dp[mask][ture] = -1;
dp[0][0] = 0;
for ( int mask = 0; mask < (1 << n); ++mask )
{
for ( int ture = 0; ture < n; ++ture )
{
if ( dp[mask][ture] == -1 )
continue;
for ( i = 0; i < n; ++i )
{
if ( mask & (1 << i) )
continue;
int new_mask = mask | (1 << i);
if ( v[i] <= dp[mask][ture] )
dp[new_mask][ture] = max(dp[new_mask][ture], dp[mask][ture] - v[i] );
else
dp[new_mask][ture + 1] = max(dp[new_mask][ture + 1], g - v[i]);
}
}
}
/* for ( int mask = 0; mask < (1 << n); ++mask, fout << endl )
for ( int ture = 0; ture <= n; ++ture)
fout << dp[mask][ture] << " ";*/
int mask = (1 << n) - 1;
int sol = -1;
for ( int ture = 1; ture <= n; ++ture )
{
// fout << dp[mask][ture] << " ";
if ( dp[mask][ture] != -1 )
{
sol = ture;
break;
}
}
// fout << endl;
fout << sol << endl;;
}
return 0;
}