Pagini recente » Cod sursa (job #99099) | Cod sursa (job #2510349) | Cod sursa (job #1100806) | Cod sursa (job #2203782) | Cod sursa (job #2273854)
#include <vector>
#include <numeric>
#include <fstream>
using namespace std;
const int INF = 1e9;
vector<int> knapsackCost(int l, int r, vector<int> &c, int s) {
vector<int> best(s+1, INF); best[0] = 0;
for (int x = l; x <= r; x++) {
for (int n = c[x]; n; n /= 2) {
int k = (n + 1)/2;
for (int i = s; i >= k*x; i--) {
best[i] = min(best[i], best[i - k*x] + k);
}
}
}
return best;
}
void knapsack(int l, int r, vector<int> &c, int s, vector<int> &ans) {
if (l == r) {
for (int i = 0; i < min(c[l], s/l); i++) ans.push_back(l);
return;
}
int m = (l + r)/2;
auto a = knapsackCost(l, m, c, s);
auto b = knapsackCost(m+1, r, c, s);
int t = 0, total = 0;
for (int i = 0, j = s; i <= s; i++) {
if (a[i] == INF) continue;
while (b[j] == INF || i + j > s) j--;
if (i + j > total) total = i + j, t = i;
}
knapsack(l, m, c, t, ans);
knapsack(m+1, r, c, s-t, ans);
}
int main() {
ifstream f("ghiozdan.in");
ofstream g("ghiozdan.out");
int n, s; f >> n >> s;
vector<int> c(201), ans;
for (int i = 0; i < n; i++) { int x; f >> x; c[x]++; }
knapsack(1, c.size() - 1, c, s, ans);
g << accumulate(ans.begin(), ans.end(), 0) << " " << ans.size() << "\n";
for (auto e : ans) g << e << "\n";
return 0;
}