Clone
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1596 Accepted Submission(s): 737
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].
圖解:http://www.cnblogs.com/oyking/p/3970845.html
思路:http://www.cnblogs.com/xiaohongmao/p/3988142.html
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int mod = 1e9 + 7;
int T, n, sum;
int t[2005], dp[2005][2005];
int main()
{
cin >> T;
while (T--) {
scanf("%d", &n);
sum = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &t[i]);
sum += t[i];
}
memset(dp, 0, sizeof(dp));
sum /= 2;
for (int i = 0; i <= t[0]; i++) {
dp[0][i] = 1;
}
for (int i = 1; i < n; i++) {
for (int j = 0; j <= sum; j++) {
for (int k = 0; k <= j && k <= t[i]; k++) {
dp[i][j] = (dp[i][j] + dp[i - 1][j - k]) % mod;
}
}
}
printf("%d\n", dp[n - 1][sum]);
}
return 0;
}