题目链接:
CloneTime Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
More evidence showed that for two clones A and B, if A was no worse than B in all fields, then B could not survive. More specifically, DRD used a vector v to represent each of his clones. The vector v has n dimensions, representing a clone having N abilities. For the i-th dimension, v[i] is an integer between 0 and T[i], where 0 is the worst and T[i] is the best. For two clones A and B, whose corresponding vectors were p and q, if for 1 <= i <= N, p[i] >= q[i], then B could not survive.
Now, as DRD's friend, ATM wants to know how many clones can survive at most.
For each test case: The first line contains 1 integer N, 1 <= N <= 2000. The second line contains N integers indicating T[1], T[2], ..., T[N]. It guarantees that the sum of T[i] in each test case is no more than 2000 and 1 <= T[i].
#include <bits/stdc++.h> using namespace std; const int N=1e6+5; typedef long long ll; const ll mod=1e9+7; int t,n,a[2005]; ll dp[4005][2003]; int main() { scanf("%d",&t); while(t--) { int sum=0,ans=0; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); ans+=a[i]; } memset(dp,0,sizeof(dp)); for(int i=0;i<=a[1];i++) { dp[i][1]=1; } for(int i=1;i<=n;i++) { sum+=a[i]; for(int j=0;j<=a[i];j++) { for(int k=0;k<=sum;k++) { dp[k+j][i]+=dp[k][i-1]%mod; dp[k+j][i]%=mod; } } } printf("%lld\n",dp[ans/2][n]); } return 0; }