https://www.luogu.org/problemnew/show/P1164
/*
dfs写法:
白书上有个问题,n个数,任意取,加和,能否等于k。
把白书的代码改一下就是这个了
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#define INF 0x3f3f3f3
using namespace std;
typedef long long LL;
const int maxn=1e2+5;
int N,M,a[maxn],ans;
void dfs(int i,int sum)
{
if(i==N+1)
{
if(sum==M)ans++;
return ;
}
if(sum>M)
return ;
dfs(i+1,sum+a[i]);
dfs(i+1,sum);
}
int main()
{
scanf("%d%d",&N,&M);
for(int i=1; i<=N; i++)
scanf("%d",&a[i]);
dfs(1,0);
printf("%d\n",ans);
return 0;
}
/*
dp
*/
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#define INF 0x3f3f3f3
using namespace std;
typedef long long LL;
const int maxn=1e2+5;
int N,M,a[maxn],ans,dp[maxn*10];
int main()
{
scanf("%d%d",&N,&M);
for(int i=1; i<=N; i++)
scanf("%d",&a[i]);
dp[0]=1;
for(int i=1;i<=N;i++)
for(int j=M;j>=a[i];j--)
dp[j]+=dp[j-a[i]];
printf("%d\n",dp[M]);
return 0;
}