hdu5000Clone dp

1107 ワード

//        
//      n   
//     a               b
//  b     
//            
//                            
//          a , c                  
//       
//      ,          sum/2   
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std ;
const int maxn = 2010 ;
typedef long long ll ;
const int mod = 1e9+7  ;
int dp[maxn][maxn] ;
int a[maxn] ;
int main()
{
    int t ;
    scanf("%d" , &t) ;
    while(t--)
    {
        int n ;
        scanf("%d"  , &n) ;
        for(int i = 1;i <= n;i++)
        scanf("%d" , &a[i]) ;
        memset(dp , 0 , sizeof(dp)) ;
        for(int i = 0;i <= a[1];i++)
        dp[1][i] = 1 ;
        int sum = a[1] ;
        for(int i = 2;i <= n;i++)
        {
            sum += a[i] ;
            for(int j = 0;j <= sum;j++)
              for(int k = j;k >= 0 && k >= j - a[i];k--)
              dp[i][j] = (dp[i][j] + dp[i-1][k])%mod ;
        }
        cout<<dp[n][sum/2]<<endl;
    }
    return 0  ;
}