fork download
  1. import java.util.*;
  2.  
  3. public class Main {
  4. static final int M = 1000000007;
  5. static final int K = 5000; // K is an offset to account for negatives
  6.  
  7. public static void main(String[] args) {
  8. Scanner scanner = new Scanner(System.in);
  9. int n = scanner.nextInt();
  10. int x = scanner.nextInt();
  11. int[] s = new int[n];
  12. for (int i = 0; i < n; i++) {
  13. s[i] = scanner.nextInt();
  14. }
  15. Arrays.sort(s);
  16.  
  17. // the subarray we're currently at
  18. long[][] dp1 = new long[n + 1][x + K + 1];
  19. // the next subarray (we'll fill this up using dp1)
  20. long[][] dp2 = new long[n + 1][x + K + 1];
  21.  
  22. dp1[0][K] = 1; // dp[0][0][0] -> 0 people, 0 unfinished groups, 0 penalty
  23. for (int i = 0; i < n; i++) {
  24. for (int j = 0; j <= (n - i); j++) { // at most n - i unfinished groups
  25. for (int k = 0; k <= x + K; k++) {
  26. if (dp1[j][k] == 0) continue;
  27. dp2[j][k] += dp1[j][k]; // i has their own group
  28. if (j > 0 && k + s[i] <= x + K) {
  29. dp2[j - 1][k + s[i]] += j * dp1[j][k]; // finish group
  30. }
  31. if (j + 1 <= n - (i + 1)) {
  32. dp2[j + 1][k - s[i]] += dp1[j][k]; // create new unfinished group
  33. }
  34. if (j <= n - (i + 1)) {
  35. dp2[j][k] += j * dp1[j][k]; // extend unfinished group
  36. }
  37. }
  38. }
  39. for (int j = 0; j <= (n - (i + 1)); j++) {
  40. for (int k = 0; k <= x + K; k++) {
  41. dp1[j][k] = dp2[j][k] % M; // i + 1 becomes the new i
  42. dp2[j][k] = 0;
  43. }
  44. }
  45. }
  46.  
  47. int ans = 0;
  48. for (int i = K; i <= x + K; i++) {
  49. ans += dp1[0][i];
  50. ans %= M;
  51. }
  52.  
  53. System.out.println(ans);
  54. }
  55. }
  56.  
Success #stdin #stdout 0.35s 75404KB
stdin
100 5000
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100 100
100 5000
74 75 86 71 23 11 87 21 18 19 65 67 54 18 60 82 27 93 87 36 33 90 70 78 25 20 50 98 44 66 96 72 71 83 88 87 13 14 18 79 76 10 54 25 45 87 49 60 74 2 81 11 23 7 84 53 78 6 22 58 67 39 65 53 19 23 33 39 65 92 66 5 79 85 78 13 91 95 92 32 89 64 70 43 29 2 30 82 84 42 70 40 15 5 53 43 27 74 34 19
stdout
193120002