fork download
  1. #include<bits/stdc++.h>
  2. #define os 1500
  3. #define inf 1000
  4. #define NAME "BALANCE"
  5. using namespace std;
  6.  
  7. int n, p, a[20];
  8. int dp[3001];
  9. vector<int> l[3001], r[3001];
  10.  
  11. int main() {
  12. ios_base::sync_with_stdio(0); cin.tie(0);
  13. freopen(NAME".INP", "r", stdin);
  14. freopen(NAME".OUT", "w", stdout);
  15. cin >> n >> p;
  16. for (int i = 1; i <= n; i++) cin >> a[i];
  17. for (int i = 0; i <= 3000; i++) dp[i] = inf;
  18. dp[os] = 0;
  19.  
  20. for (int i = 1; i <= n; i++) {
  21. int temp[3001];
  22. vector<int> tl[3001], tr[3001];
  23. for (int j = 0; j <= 3000; j++) {
  24. temp[j] = dp[j];
  25. tl[j] = l[j];
  26. tr[j] = r[j];
  27. }
  28. for (int d = -1500; d <= 1500; d++) {
  29. int id = d + os;
  30. if (dp[id] >= inf) continue;
  31. int x = d - a[i] + os;
  32. if (abs(d - a[i]) <= 1500 && temp[x] > dp[id] + 1) {
  33. temp[x] = dp[id] + 1;
  34. tl[x] = l[id];
  35. tr[x] = r[id];
  36. tl[x].push_back(i);
  37. }
  38. x = d + a[i] + os;
  39. if (abs(d + a[i]) <= 1500 && temp[x] > dp[id] + 1) {
  40. temp[x] = dp[id] + 1;
  41. tl[x] = l[id];
  42. tr[x] = r[id];
  43. tr[x].push_back(i);
  44. }
  45. }
  46.  
  47. for (int j = 0; j <= 3000; j++) {
  48. dp[j] = temp[j];
  49. l[j] = tl[j];
  50. r[j] = tr[j];
  51. }
  52. }
  53.  
  54. int target = p + os;
  55. if (dp[target] >= inf) {
  56. cout << -1 << endl;
  57. } else {
  58. cout << l[target].size();
  59. for (int x : l[target]) cout << " " << x;
  60. cout << endl;
  61. cout << r[target].size();
  62. for (int x : r[target]) cout << " " << x;
  63. cout << endl;
  64. }
  65. return 0;
  66. }
  67.  
Success #stdin #stdout 0.01s 5280KB
stdin
Standard input is empty
stdout
Standard output is empty