/*dfs
#include<bits/stdc++.h>
using namespace std;
int n,m,a[105],mark[105];
int ans;
void dfs(int step,int flag){//step表示付的钱
if(step>m) return ;
if(step==m){
ans++;
return ;
}
for(int i=flag;i<n;i++){
if(mark[i]==0){
mark[i]=1;
dfs(step+a[i],i);
mark[i]=0;
}
}
}
int main(){
cin>>n>>m;
for(int i=0;i<n;i++) cin>>a[i];
dfs(0,0);
cout<<ans;
return 0;
}
*/
/*
背包
*/
#include<bits/stdc++.h>
using namespace std;
int n,m,a[105],f[105][10005];//横是资金,竖是商品
int main(){
cin>>n>>m;//n是商品数量,m是资金
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) {
for(int j=1;j<=m;j++){
if(a[i]==j){
f[i][j]=f[i-1][j]+1;//如果这道菜的价格刚好等于钱包那么zh
//只选这道菜也构成一个选项在这个空的同一列上一行加一就行
}
else if(a[i]>j){
f[i][j]=f[i-1][j];//钱不够你想买也不行所有方法数和上一行一样
}
else {
f[i][j]=f[i-1][j]+f[i-1][j-a[i]];
//这个是一个通式上面分别是当j-a[i]小于等于0的两种情况
}
}
}
cout<<f[n][m];
return 0;
}