#include <bits/stdc++.h>
using namespace std;
#define F0R(i, n) for (int i = 0; i < n;i++)
#define FOR(i, j, n) for(int i = j; i < n;i++)
template<typename T>
using V = vector<T>;
using vi = V<int>;
constexpr int INF = 1e9;
int main() {
int n, m, k; cin >> n >> m >> k;
vi a(n), b(m);
int sumB = 0, sumA = 0;
F0R(i, n)
cin >> a[i];
F0R(i, m)
cin >> b[i];
swap(a, b);
swap(m, n);
for (auto x : b)
sumB += x;
for (auto x : a)
sumA += x;
F0R(i, m) {
if (b[i] < k) {
cout << "Impossible\n";
return 0;
}
}
int BOUND = max(sumB, sumA) + 1;
auto dp(V<vi>(BOUND,vi(k + 1,-INF)));
dp[0][1] = 0;
FOR(i, 1, n + 1) {
auto newDp = dp;
newDp[0][1] = 0;
FOR(j, 1, BOUND) {
FOR(t, 0, k + 1) {
if (j - a[i - 1] < 0) continue;
int oldSum = j - a[i - 1];
if (t > 0 && dp[oldSum][t - 1] + a[i - 1] >= m)
newDp[j][t] = max(newDp[j][t], 0);
newDp[j][t] = max(newDp[j][t], dp[oldSum][t] + a[i - 1]);
}
}
dp = newDp;
}
FOR(i, sumB, BOUND) {
if (dp[i][k] >= 0) {
cout << i - sumB << endl;
return 0;
}
}
cout << "Impossible\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |