# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1187024 | GoBananas69 | Detecting Molecules (IOI16_molecules) | C++20 | 0 ms | 0 KiB |
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
vector<int> find_subset(int l, int u, const vector<int>& w) {
int n = (int)w.size();
if (n == 0)
return {};
int sum = 0;
for (int x : w) sum += x;
vector<vector<bool>> dp(n + 1, vector<bool>(sum + 1, false));
dp[0][0] = true;
for (int i = 1; i <= n; ++i)
dp[i][0] = true;
for (int i = 1; i <= n; ++i) {
for (int j = 1; j <= sum; ++j) {
dp[i][j] = dp[i - 1][j] || (j >= w[i - 1] && dp[i - 1][j - w[i - 1]]);
}
}
for (int s = l; s <= u; ++s) {
if (s <= sum && dp[n][s]) {
int curr = s;
vector<int> res;
for (int i = n; i > 0 && curr > 0; --i) {
if (curr >= w[i - 1] && dp[i - 1][curr - w[i - 1]]) {
res.push_back(i - 1);
curr -= w[i - 1];
}
}
return res;
}
}
return {};
}
// signed main() {
// cin.tie(0)->sync_with_stdio(0);
// vector<int> res = find_subset(15, 17, {8, 7});
// for (int &i: res) {
// cout << i << ' ';
// }
// }