#include #define endl '\n' using namespace std; int n, d; int a[100005]; int pr[100005]; int br[1305]; int dp[2][1000005], mi; vector slst; int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); freopen("parties.in", "r", stdin); freopen("parties.out", "w", stdout); cin>>n>>d; if(n<=6000) { dp[1][d]=1; mi=d; slst.push_back(d); for(int i=1; i<=n; i++) cin>>a[i]; sort(a+1, a+n+1); reverse(a+1, a+n+1); for(int i=1; i<=n; i++) pr[i]=pr[i-1]+a[i]; for(int i=1; i<=n; i++) { if(a[i]<=780) { br[a[i]]++; } } int ans=0, i; for(i=1; i<=n; i++) { if(pr[n]-pr[i-1]780) { ans++; if(slst.size()<=40000) { int rm=slst.size(); for(int pkz=0; pkza[i] && !dp[1][j-a[i]]) { dp[1][j-a[i]]=1; slst.push_back(j-a[i]); if(j-a[i]a[i] && !dp[1][j-a[i]]) { dp[1][j-a[i]]=1; slst.push_back(j-a[i]); if(j-a[i]=a[i]+1; j--) { if(!dp[1][j] || dp[0][j]==br[a[i]] || dp[1][j-a[i]]) continue; dp[0][j-a[i]]=dp[0][j]+1; dp[1][j-a[i]]=1; if(j-a[i]=0; j--) dp[0][j]=0; while(i>a[i]; } sort(a+1, a+n+1); reverse(a+1, a+n+1); for(int i=1; i<=n; i++) pr[i]=pr[i-1]+a[i]; int ans=0; for(int i=1; i<=n; i++) { if(pr[n]-pr[i-1]a[i]) d-=a[i]; } cout<