Link to this code:
https://cses.fi/paste/82453b9b82210d5dc31c5e//* 777 */
#include "bits/stdc++.h"
using namespace std;
#define int long long
#define endl '\n'
#define all(x) x.begin(),x.end()
#define sortf(x) sort(all(x))
#define sortfn(x,fn) sort(all(x),fn)
#define sortr(x) sort(all(x),greater<int>())
using vi = vector <int>;
using vii = vector <vi>;
using viii = vector <vii>;
using pii = pair<int,int>;
using vpii = vector<pii>;
const int inf = INT_MAX;
int res = 0, n;
vi coins;
int dp[2][1000010];
void pre(){
memset(dp, -1, sizeof(dp));
}
int topDown(int level, int sum_left) {
// pruning
if (sum_left == 0) return 0;
// base case
if (level == n || coins[level] > sum_left) return inf;
// cache check
if (dp[level][sum_left] != -1) return dp[level][sum_left];
// transitions
int ans = topDown(level + 1, sum_left);
ans = min(ans, 1 + topDown(level, sum_left - coins[level]));
// save and return
return dp[level][sum_left]=ans;
}
int bottomUp(int target_sum) {
// base case
for (int sum_left = 1 ; sum_left <= target_sum ; sum_left++) dp[n & 1][sum_left] = inf;
for (int level = n - 1 ; level >= 0 ; level--) {
for (int sum_left = 1 ; sum_left < coins[level] ; sum_left++) dp[level & 1][sum_left] = inf;
for (int sum_left = coins[level] ; sum_left <= target_sum ; sum_left++) {
int ans = dp[(level + 1) & 1][sum_left];
ans = min(ans, 1 + dp[level & 1][sum_left - coins[level]]);
dp[level & 1][sum_left]=ans;
// cout << level << " " << sum_left << " " << ans << endl;
}
}
return dp[0][target_sum];
}
void solve(){
int k;
cin >> n >> k;
coins.resize(n);
for (auto &x: coins) cin >> x;
sortf(coins);
// res = topDown(0, k);
res = bottomUp(k);
if (res == inf) res = -1;
cout << res << endl;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// pre();
solve();
}