# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1134232 | TroySer | Detecting Molecules (IOI16_molecules) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
using namespace std;
bool hasResponse = false;
vector<int> best;
void solution(int currInd, int currSum, vector<int> &currArray, int u, int l, int n, vector<int> &w, vector<vector<int> > &memo) {
if (hasResponse) {
return;
}
if (currSum > u || currInd > n) {
return;
}
if (currInd == n && l <= currSum && currSum <= u) {
// cout << "LOL" <<
hasResponse = true;
best = currArray;
return;
}
if (currInd == n) {
return;
}
if (currInd != -1 && memo[currInd][currSum] == 0) {
return;
}
if (0 <= currInd && currInd < n) {
currSum += w[currInd];
}
for (int ind = currInd + 1; ind <= n; ind++) {
if (ind != n) currArray.push_back(ind);
solution(ind, currSum, currArray, u, l, n, w, memo);
if (ind != n) currArray.pop_back();
}
if (currInd == -1 || currSum > u) {
return;
}
memo[currInd][currSum] = 0;
return;
}
vector<int> find_subset(int l, int u, vector<int> w) {
int n = w.size();
best = {-1};
vector<int> arr;
vector<vector<int> > memo;
memo.resize(n, vector<int>(u + 1, -1));
solution(-1, 0, arr, u, l, n, w, memo);
if (best[0] == -1) {
return vector<int>(0);
} else {
return best;
}
}
int main() {
int u, l;
vector<int> w;
int n;
cin >> n >> u >> l;
w.resize(n);
for (int i = 0; i < n; i++) {
cin >> w[i];
}
vector<int> res;
res = find_subset(l, u, w);
for (auto l: res) {
cout << l << " ";
}
cout << endl;
}