#include <bits/stdc++.h>
using namespace std;
const int N = 20;
int a[N];
int used[N];
int n, m;
int res = N;
void dfs(int u, int cnt)
{
if(cnt >= res) return;
if(u > n)
{
res = cnt;
return;
}
for(int i = 0; i < cnt; i++)
{
if(m - used[i] >= a[u])
{
used[i] += a[u];
dfs(u+1,cnt);
used[i] -= a[u];
}
}
used[cnt] += a[u];
dfs(u + 1,cnt + 1);
used[cnt] -= a[u];
}
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i++) cin >> a[i];
dfs(1,0);
cout << res << endl;
return 0;
}
#include <bits/stdc++.h>
using namespace std;
const int N = 9;
int ones[1 << N], pos[1 << N];
int col[N],row[N],g[3][3];
string s;
int lowbit(int x)
{
return x & -x;
}
int get(int i, int j)
{
return row[i] & col[j] & g[i / 3][j / 3];
}
bool dfs(int cnt)
{
if(cnt == 0) return true;
int minv = 10;
int sx, sy;
for(int i = 0, k = 0; i < N; i++)
{
for(int j = 0; j < N; j++, k++)
{
if(s[k] == '.')
{
if(ones[get(i,j)] < minv)
{
minv = ones[get(i,j)];
sx = i;
sy = j;
}
}
}
}
for(int i = get(sx,sy); i; i -= lowbit(i))
{
int t = pos[lowbit(i)];
s[sx * 9 + sy] = '1' + t;
row[sx] -= (1 << t);
col[sy] -= (1 << t);
g[sx / 3][sy / 3] -= (1 << t);
if(dfs(cnt - 1)) return true;
g[sx / 3][sy / 3] += (1 << t);
col[sy] += (1 << t);
row[sx] += (1 << t);
s[sx * 9 + sy] = '.';
}
return false;
}
void init()
{
for(int i = 0; i < N; i++) col[i] = row[i] = (1 << N) - 1;
for(int i = 0; i < 3; i++)
{
for(int j = 0; j < 3; j++)
{
g[i][j] = (1 << N) - 1;
}
}
}
int main()
{
for(int i = 0; i < N; i++) pos[1 << i] = i;
for(int i = 0; i < 1 << N; i++)
{
int k = 0;
for(int j = i; j; j -= lowbit(j)) k++;
ones[i] = k;
}
while(cin >> s && s[0] != 'e')
{
init();
int cnt = 0;
for(int i = 0,k = 0; i < N; i++)
{
for(int j = 0; j < N; j++,k++)
{
if(s[k] != '.')
{
int t = s[k] - '1';
row[i] -= (1 << t);
col[j] -= (1 << t);
g[i / 3][j / 3] -= (1 << t);
}
else cnt ++;
}
}
dfs(cnt);
cout << s << endl;
}
return 0;
}