hdu 5800

来源:互联网 发布:全球淘宝下载 编辑:程序博客网 时间:2024/06/07 13:51
#include <iostream>#include <cstdio>#include <string.h>#include <algorithm>#include <map>#include <queue>#include <stdlib.h>#include <cmath>#include <vector>#include <stack>#define clr(x) memset(x,0,sizeof(x))#define clr2(x) memset(x,INF,sizeof(x))#define clr3(x) memset(x,-INF,sizeof(x))#define INF 0x3f3f3f3f#define MAXN 1001#define MAXM 1001#define pb(x) push_back(x)#define ll long long#define ull unsigned long longusing namespace std;int w[MAXN],dp[MAXN][MAXN][3][3];int n,s;const int mod=1e9+7;void solve(){    scanf("%d%d",&n,&s);    for (int i=1;i<=n;i++)        scanf("%d",&w[i]);    dp[0][0][0][0]=1;    for (int i=1;i<=n;i++)        for (int j=0;j<=s;j++)         for (int s1=0;s1<=2;s1++)          for (int s2=0;s2<=2;s2++)    {       dp[i][j][s1][s2]= dp[i-1][j][s1][s2];       if (j-w[i]>=0)       {             dp[i][j][s1][s2]+= dp[i-1][j-w[i]][s1][s2];             dp[i][j][s1][s2] %=mod;       }       if (s1-1>=0 && j-w[i]>=0 )        {            dp[i][j][s1][s2]+= dp[i-1][j-w[i]][s1-1][s2];            dp[i][j][s1][s2] %=mod;        }       if (s2-1>=0)        {            dp[i][j][s1][s2] += dp[i-1][j][s1][s2-1];            dp[i][j][s1][s2] %=mod;        }    }    ll ans=0;    for (int j=0;j<=s;j++) ans+=dp[n][j][2][2];    ans*=4;    ans%=mod;    printf("%lld\n",ans);}int main(){    int T,Case=0;    scanf("%d",&T);    while (T--)        solve();    return 0;}
0 0