#include<iostream>
#include<vector>
using namespace std;
int minCoin(vector<int>& n,int aim){
//dp[N][0]表示,当所有的面额全部试完之后,并且aim = 0;则dp[N][0] = 0;如果不为0;dp[N][m] = -1;
//dp[i][rest] 表示的是纸币的范围在i~N-1时,所需要的最少的货币
//dp[i][rest] 如果想要得到最优值是,{dp[i][Rest - k*arr[i]] + k(0~N-1)},在这个集合中找出最小的一个;
//dp[i][rest - arr[i]]如果想要得到最优值,{dp[i][Rest - k*arr[i]](1~N-1)};
//综上dp[i][Rest] = min(dp[i+1][Rest],dp[i][Rest-arr[i]] + 1);
if(n.size() == 0 || aim < 0) return -1;
int N = n.size();
vector<vector<int>> dp(N + 1,vector<int>(aim + 1));
dp[N][0] = 0;
for(int i = 1; i <= aim; ++i){
dp[N][i] = -1;
}
for(int i = N - 1; i >= 0; --i){
for(int j = 0; j <= aim; ++j){
dp[i][j] = -1;
if(dp[i+1][j] != -1){
dp[i][j] = dp[i + 1][j];
}
if(j - n[i] >= 0 && dp[i][j - n[i]] != -1){
if(dp[i][j] == -1){
dp[i][j] = dp[i][j - n[i]] + 1;
}else{
dp[i][j] = min(dp[i][j],dp[i][j - n[i]] + 1);
}
}
}
}
return dp[0][aim];
}
int main(){
int n,aim;
while(cin >> n >> aim){
vector<int> nums(n);
for(int i = 0; i < n; ++i){
cin >> nums[i];
}
cout << minCoin(nums,aim) << endl;
}
return 0;
}