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