/*
* Problem :: 2293 / 동전 1
*
* Kind :: Dynamic Programming
*
* Insight
* - dp[i][j] = [1,i] 번째의 동전을 사용해서 j 원을 나타낼 수 있는 경우의 수
* + 근데 메모리가 4MB 밖에 안되네...?
* # dp[j] = j 원을 나타낼 수 있는 경우의 수로 표현하자
* 사용한 동전의 종류는 for 문에서 처리하도록 하자
*
* Point
* - dp[i][j] 로 구현하면,
* + dp[i][j] = dp[i-1][j]
* if (j >= C[i]) dp[i][j] += dp[i][j-C[i]]
* dp[j] 로 구현하면,
* + if (j >= C[i]) dp += dp[i][j-C[i]]
* # 굳이 dp[i][j] = dp[i-1][j] 를 해주지 않아도 된다
*
* - dp[0] = 1
* + 1원, 5원 짜리 동전이 있고 10원을 표현하는 가짓수,
* (1원 : 10개, 5원 : 0개)
* (1원 : 5개, 5원 : 1개)
* (1원 : 0개, 5원 : 2개)
* + 그렇다면 1원, 5원 짜리 동전이 있고 0원을 표현하고 싶다면,
* (1원 : 0개, 5원 : 0개)
* 그래서 dp[0] = 1 이다
*/
//
// BOJ
// ver.C++
//
// Created by GGlifer
//
// Open Source
#include <iostream>
#include <cstring>
using namespace std;
#define endl '\n'
// Set up : Global Variables
/* None */
// Set up : Functions Declaration
/* None */
int main()
{
// Set up : I/O
ios::sync_with_stdio(false);
cin.tie(nullptr);
// Set up : Input
int N, K;
cin >> N >> K;
int C[N+1];
for (int i=1; i<=N; i++) {
cin >> C[i];
}
// Process
int dp[K+1];
memset(dp, 0, sizeof(dp));
dp[0] = 1;
for (int i=1; i<=N; i++) {
for (int j=1; j<=K; j++) {
/* 이 순간에 dp[j]는 [1,i-1] 번째의 동전을 사용해서 j 원을 만드는 가짓수를 뜻함 */
if (j >= C[i]) {
dp[j] += dp[j-C[i]];
}
/* 이제 dp[j]는 dp[j] = [1,i] 번째의 동전을 사용해서 j 원을 만드는 가짓수를 뜻함 */
}
}
// Control : Output
/* dp[K] = [1,N] 번째의 동전을 사용해서 K 원을 만드는 가짓수 */
cout << dp[K] << endl;
}
// Helper Functions
/* None */