#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;
}