Pagini recente » Borderou de evaluare (job #2623878) | Borderou de evaluare (job #1533847) | Cod sursa (job #923943) | Borderou de evaluare (job #1523624) | Cod sursa (job #3356342)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("ghiozdan.in");
ofstream fout("ghiozdan.out");
int n, g;
int count_w[205];
int dp[75005];
struct Bundle {
int w;
int items;
int orig;
};
vector<Bundle> bundles;
vector<bool> take[1500];
int main() {
fin >> n >> g;
for (int i = 1; i <= n; ++i) {
int w;
fin >> w;
count_w[w]++;
}
fin.close();
for (int w = 1; w <= 200; ++w) {
if (count_w[w] > 0) {
int rem = count_w[w];
int k = 1;
while (rem > 0) {
int use = min(k, rem);
bundles.push_back({use * w, use, w});
rem -= use;
k *= 2;
}
}
}
for (int j = 1; j <= g; ++j) {
dp[j] = 1e9;
}
dp[0] = 0;
int M = bundles.size();
for (int i = 0; i < M; ++i) {
take[i].assign(g + 1, false);
int W = bundles[i].w;
int K = bundles[i].items;
for (int j = g; j >= W; --j) {
if (dp[j - W] + K < dp[j]) {
dp[j] = dp[j - W] + K;
take[i][j] = true;
}
}
}
int best_g = 0;
for (int j = g; j >= 0; --j) {
if (dp[j] != 1e9) {
best_g = j;
break;
}
}
fout << best_g << " " << dp[best_g] << "\n";
int curr_j = best_g;
for (int i = M - 1; i >= 0; --i) {
if (take[i][curr_j]) {
for (int k = 0; k < bundles[i].items; ++k) {
fout << bundles[i].orig << "\n";
}
curr_j -= bundles[i].w;
}
}
return 0;
}