这个问题有必要动态规划吗?直接组合数就好了呀!比如这个店有10种菜,其中3种2块,3种3块,4种5块,一共15块,可以是53,或者是52+3+2,或者52+32+22,或者33+2*3 总数量为C(4,3)+C(4,2)*C(3,1)*C(3,1)+ C(4,2)*C(3,2)*C(3,2)+C(3,3)*C(3,3)
'''
#include<cstdio>
using namespace std;
long long ans=0;
long long c(long long n,long long m)
{
long long i,x=1;
for(i=n;i>m;i--)
{
x*=i;
x/=n+1-i;
}
return x;
}
void fun(long long *a,long long *b,long long m,long long k)
{
long long i,j,x=1;
if(k>1000)
return;
if(m==0)
{
for(i=0;i<=1000;i++)
if(a[i])
x*=c(a[i],b[i]);
ans+=x;
return;
}
for(j=k+1;j<=1000 && a[j]==0;j++);
for(i=0;i<=a[j];i++)
{
if(m>=i*j)
{
if(j<=1000)
{
b[j]=i;
fun(a,b,m-i*j,j);
b[j]=0;
}
}
else
break;
}
}
int main()
{
long long n,m,i,a[1001],b[1001],x;
scanf("%lld%lld",&n,&m);
for(i=0;i<=1000;i++)
{
a[i]=0;
b[i]=0;
}
for(i=0;i<n;i++)
{
scanf("%d",&x);
a[x]++;
}
fun(a,b,m,-1);
printf("%lld",ans);
return 0;
}