C language source code: [cpp] # include <stdio. h> # include <limits. h> # define maxsize 4010 # define size 2000 int dp [110] [maxsize]; int max2 (int a, int B) {return a> B? A: B;} int max (int a, int B, int c) {return max2 (a, B)> c? Max2 (a, B): c;} int a [1010]; int main () {int t, n, num, I, j, zero; scanf ("% d", & t); for (num = 1; num <= t; num ++) {zero = 0; scanf ("% d ", & n); j = 1; for (I = 1; I <= n; I ++) {scanf ("% d", & a [j ++]); if (a [J-1] = 0) {zero = 1; j -- ;}} n = J-1; for (I = 0; I <110; I ++) for (j = 0; j <maxsize; j ++) dp [I] [j] = INT_MIN; dp [0] [size] = 0; for (I = 1; I <= n; I ++) for (j = 0; j <maxsize; j ++) if (j-a [I]> = 0 & j + a [I] <maxsize) dp [I] [j] = max (dp [I-1] [j-a [I] + a [I], dp [I-1] [j + a [I] + a [I], dp [I-1] [j]); else {if (j-a [I] <0 & j + a [I] <maxsize) dp [I] [j] = max2 (dp [I-1] [j + a [I] + a [I], dp [I-1] [j]); else if (j + a [I]> = maxsize & j-a [I]> = 0) dp [I] [j] = max2 (dp [I-1] [j-a [I] + a [I], dp [I-1] [j]); else dp [I] [j] = dp [I-1] [j];} if (dp [n] [size] = 0 & zero = 0) printf ("Case % d:-1 \ n", num); else printf ("Case % d: % d \ n", num, dp [n] [size]/2 );}}