Advertisement
a53

Sormin

a53
May 31st, 2019
153
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.34 KB | None | 0 0
  1. #include <cstdio>
  2. #include <cstring>
  3. #define MAXN 100000
  4. #define MAXS 50000
  5. #define MAXV 5000
  6. int v[MAXN], fr[MAXV + 1];
  7. int frr[MAXV + 1];
  8. int d[MAXS + 1], nr[MAXS + 1];
  9. int s;
  10.  
  11. inline char bun(int k)
  12. {
  13. memset(d, -1, sizeof d);
  14. d[0] = 0;
  15. int i, j;
  16. for(i = 1; i <= MAXV; i++)
  17. {
  18. if((i | k) == k && fr[i])
  19. {
  20. for(j = 0; j < i; j++)
  21. if(d[j] != -1)
  22. nr[j] = fr[i];
  23. for(j = i; j <= s; j++)
  24. {
  25. if(d[j] == -1 && nr[j - i] > 0)
  26. {
  27. d[j] = i;
  28. nr[j] = nr[j - i] - 1;
  29. }
  30. else if(d[j] != -1)
  31. nr[j] = fr[i];
  32. else
  33. nr[j] = 0;
  34. }
  35. }
  36. }
  37. return d[s] != -1;
  38. }
  39.  
  40. int main()
  41. {
  42. freopen("sormin.in", "r", stdin);
  43. freopen("sormin.out", "w", stdout);;
  44. int n, i, r = 0;
  45. scanf("%d%d", &n, &s);
  46. for(i = 0; i < n; i++)
  47. {
  48. scanf("%d", &v[i]);
  49. fr[v[i]]++;
  50. }
  51. i = 0;
  52. while((1 << i) <= s)
  53. {
  54. r += (1 << i);
  55. i++;
  56. }
  57. i--;
  58. while(i >= 0){
  59. if(bun(r - (1 << i)))
  60. r -= (1 << i);
  61. i--;
  62. }
  63. bun(r);
  64. int x, nrr = 0;
  65. x = s;
  66. while(x > 0)
  67. {
  68. frr[d[x]]++;
  69. x -= d[x];
  70. nrr++;
  71. }
  72. printf("%d %d\n", r, nrr);
  73. for(i = 0; i < n; i++)
  74. {
  75. if(frr[v[i]]){
  76. printf("%d ", v[i]);
  77. frr[v[i]]--;
  78. }
  79. }
  80. return 0;
  81. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement