Pagini recente » Cod sursa (job #716763) | Cod sursa (job #1474182) | Cod sursa (job #539887) | Cod sursa (job #725188) | Cod sursa (job #3262533)
#include <stdio.h>
#include <algorithm>
#include <map>
#define MAX(a, b) (a > b ? a : b)
#define MIN(a, b) (a < b ? a : b)
int vs[75000 + 5];
int wh[20000 + 5];
FILE *out;
bool bigger(int a, int b)
{
return a > b;
}
// int v[75000 + 5];
std::map<int, int, decltype(&bigger)> v(bigger);
void createsol(int sol);
bool condition(int a, int b, int s)
{
if (v[a] + v[b] != v[s])
return 0;
createsol(b);
createsol(a);
return 1;
}
void createsol(int g)
{
if (g <= 0)
return;
if (v[g] == 1) {
fprintf(out, "%d\n", g);
return;
}
int a = vs[g];
if (a > 0 && condition(a, g - a, g))
return;
for (int a = 1; a < g; a++)
if (v.find(a) != v.end()) {
int b = g - a;
if (v.find(b) != v.end() && condition(a, b, g))
return;
}
}
int main()
{
FILE *in = fopen("ghiozdan.in", "r");
int n, g;
fscanf(in, "%d%d", &n, &g);
for (int i = 0; i < n; i++)
fscanf(in, "%d", &wh[i]);
std::sort(wh, wh + n, bigger);
v[0] = 0;
for (int i = 0; i < n; i++) {
for (const auto& pair : v) {
int s = wh[i] + pair.first;
if (s <= g && (v.find(s) == v.end() || v[s] > 1 + pair.second)) {
v[s] = 1 + pair.second;
vs[s] = pair.first;
}
}
}
fclose(in);
out = fopen("ghiozdan.out", "w");
g = v.begin()->first;
fprintf(out, "%d %d\n", g, v[g]);
createsol(g);
// for (const auto& pair : v)
// fprintf(out, "%d ", pair.first);
fclose(out);
}