Madiyar

Untitled

Jun 2nd, 2013
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.36 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <cstdlib>
  5. #include <vector>
  6. #include <set>
  7. #include <map>
  8. #include <cassert>
  9. #include <ctime>
  10. #include <cmath>
  11. #include <string>
  12. #include <cstring>
  13. #include <queue>
  14. using namespace std;
  15.  
  16. #define f first
  17. #define s second
  18. #define mp make_pair
  19. #define pb push_back
  20. #define pii pair<int, int>
  21. #define vi vector<int>
  22. #define all(v) (v).begin(), (v).end()
  23. #define forit(it,v) for (typeof(v.begin()) it = v.begin(); it != v.end(); ++it)
  24. #define f0(a) memset(a, 0, sizeof(a))
  25. #define ll long long
  26.  
  27. #ifdef WIN32
  28. #define I64 "%I64d"
  29. #else
  30. #define I64 "%lld"
  31. #endif
  32. int n, k;
  33. pair<pii, int> a[10000];
  34. bool dp[105][2][5000], fr[105][52][5000];
  35. int size[1000], from[1000];
  36.  
  37. int main() {
  38. freopen("input.txt", "r", stdin);
  39. freopen("output.txt", "w", stdout);
  40. scanf("%d%d", &n, &k);
  41. for (int i = 0; i < n; ++i) {
  42. int c, l;
  43. scanf("%d%d", &l, &c);
  44. a[i] = mp(mp(c, l), i);
  45. }
  46. sort(a, a + n);
  47.  
  48. int needsum = 0;
  49.  
  50. for (int l = 0; l < n; ++l) {
  51. int r = l;
  52. int type = a[l].f.f;
  53. while (r < n && type == a[r].f.f) ++r;
  54.  
  55. int sum = 0;
  56. for (int i = l; i < r; ++i)
  57. sum += a[i].f.s;
  58.  
  59. if (type == 1) needsum = sum;
  60.  
  61. if (sum != needsum) {
  62. puts("NO");
  63. return 0;
  64. }
  65.  
  66. size[type] = r - l;
  67. from[type] = l;
  68.  
  69. dp[type][0][0] = true;
  70. for (int i = 0; i < r - l; ++i)
  71. {
  72. for (int j = 0; j <= sum; ++j) if (dp[type][0][j]) {
  73. if (j + a[i + l].f.s <= sum) {
  74. dp[type][1][j + a[i + l].f.s] = true;
  75. fr[type][i + 1][j + a[i + l].f.s] = true;
  76. }
  77.  
  78. dp[type][1][j] = true;
  79. fr[type][i + 1][j] = false;
  80. }
  81.  
  82. for (int j = 0; j <= sum; ++j) {
  83. dp[type][0][j] = dp[type][1][j];
  84. dp[type][1][j] = false;
  85. }
  86. }
  87. l = r - 1;
  88. }
  89.  
  90.  
  91. int weight = -1;
  92. for (int i = 1; i < needsum; ++i) {
  93. bool ok = true;
  94.  
  95. for (int j = 1; ok && j <= k; ++j)
  96. if (!dp[j][0][i]) ok = false;
  97.  
  98. if (ok) {
  99. puts("YES");
  100. weight = i;
  101. break;
  102. }
  103. }
  104.  
  105. if (weight == -1) {
  106. puts("NO");
  107. return 0;
  108. }
  109.  
  110. vi ansv;
  111. for (int type = 1; type <= k; ++type) {
  112. int j = weight;
  113. for (int i = size[type]; i > 0; --i) {
  114. if (fr[type][i][j]) {
  115. ansv.pb(a[from[type] + i - 1].s);
  116. j -= a[from[type] + i - 1].f.s;
  117. }
  118. }
  119. }
  120. sort(all(ansv));
  121. forit(it, ansv)
  122. printf("%d ", *it + 1);
  123. return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment