首先我们考虑什么情况能够得到最多的情况:
1.首先如果两个人的各项属性之和相同,且并非每一项都相同,那么他们必定至少有一项大于对方,且有一项小于对方.所以和相等的能够组成不同的情况
2.再考虑,当两个人的各项属性之和不相等却符合题设要求的时候,设他们为a和b,那么一定存在和a总和相等的c,且c与b矛盾,因为c可以所有项与b相同,仅有一项不等于b(那么必然矛盾),或者说c的一项属性为0的时候,依旧不能让其他属性和b相等,那么必然矛盾,所以选取b会导致c不能选,所以不会影响最终结果,所以最终选取最多的情况一定是所有情况的和相同.
3.因为要取模,所以不能在算完结果后再比较大小,所以只能预判,也就是要得到最大情况,我们要取的是和为sumT[i]/2的选取方案,因为和取sum/2时,取所有数取平均数为基准,当和为sum/2时才可以,在这个时候每个数通过增减获得异于它本身的方案数是最多的
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cstdio>
#define MAX 2007
#define MOD 1000000007
using namespace std;
typedef long long LL;
int t,n;
LL dp[MAX][MAX];
int a[MAX];
int main ( )
{
scanf ( "%d" , &t );
while ( t-- )
{
scanf ( "%d" , &n );
int sum = 0;
for ( int i = 1 ; i <= n ; i++ )
{
scanf ( "%d" , &a[i] );
sum += a[i];
}
memset ( dp , 0 , sizeof ( dp ) );
dp[0][0] = 1;
for ( int i = 1 ; i <= n ; i++ )
for ( int j = 0 ; j <= a[i] ; j++ )
for ( int k = j ; k <= sum/2 ; k++ )
dp[i][k] = ( dp[i][k] + dp[i-1][k-j] )%MOD;
printf ( "%lld\n" , dp[n][sum/2] );
}
}