#include <cstdio>
#include <algorithm>
#include <functional>
static const int MAX_N = 24;
static const int MAX_M = 100;
int n, m;
int plecaki[MAX_M];
int przedmioty[MAX_N];
int uzyte[MAX_N];
int plecaki_do_uzycia;
bool umiesc_plecak(int k)
{
/*for(int a = 0; a < k; ++a) printf(" ");
printf("umieszczam paczke %d\n", k);
for(int i = 0; i < plecaki_do_uzycia; ++i)
printf("%d ", uzyte[i]);
printf("\n");*/
for(int i = 0; i < plecaki_do_uzycia; ++i)
{
//for(int a = 0; a < k; ++a) printf(" ");
//printf(" probuje w plecaku %d\n", i);
if (plecaki[i] - uzyte[i] > przedmioty[k])
{
if(k == n)
return true;
uzyte[i] += przedmioty[k];
if (umiesc_plecak(k + 1))
return true;
uzyte[i] -= przedmioty[k];
}
}
return false;
}
bool check(int N)
{
// printf("Sprawdzam %d\n", N);
for(int i = 0; i < plecaki_do_uzycia; ++i)
uzyte[i] = 0;
return umiesc_plecak(0);
return N >= 2;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i = 0; i < n; ++i)
scanf("%d", przedmioty + i);
for(int i = 0; i < m; ++i)
scanf("%d", plecaki + i);
std::sort(plecaki, plecaki + m, std::greater<int>());
std::sort(przedmioty, przedmioty + n, std::greater<int>());
plecaki_do_uzycia = std::min(n, m);
if (!check(plecaki_do_uzycia))
printf("NIE\n");
else {
int beg = 1;
int end = plecaki_do_uzycia;
while (end - beg > 1) {
int centre = (beg + end + 1) / 2;
if (check(centre))
end = centre;
else
beg = centre;
}
printf("%d\n", (beg+end+1)/2);
}
return 0;
}
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 | #include <cstdio> #include <algorithm> #include <functional> static const int MAX_N = 24; static const int MAX_M = 100; int n, m; int plecaki[MAX_M]; int przedmioty[MAX_N]; int uzyte[MAX_N]; int plecaki_do_uzycia; bool umiesc_plecak(int k) { /*for(int a = 0; a < k; ++a) printf(" "); printf("umieszczam paczke %d\n", k); for(int i = 0; i < plecaki_do_uzycia; ++i) printf("%d ", uzyte[i]); printf("\n");*/ for(int i = 0; i < plecaki_do_uzycia; ++i) { //for(int a = 0; a < k; ++a) printf(" "); //printf(" probuje w plecaku %d\n", i); if (plecaki[i] - uzyte[i] > przedmioty[k]) { if(k == n) return true; uzyte[i] += przedmioty[k]; if (umiesc_plecak(k + 1)) return true; uzyte[i] -= przedmioty[k]; } } return false; } bool check(int N) { // printf("Sprawdzam %d\n", N); for(int i = 0; i < plecaki_do_uzycia; ++i) uzyte[i] = 0; return umiesc_plecak(0); return N >= 2; } int main() { scanf("%d%d", &n, &m); for(int i = 0; i < n; ++i) scanf("%d", przedmioty + i); for(int i = 0; i < m; ++i) scanf("%d", plecaki + i); std::sort(plecaki, plecaki + m, std::greater<int>()); std::sort(przedmioty, przedmioty + n, std::greater<int>()); plecaki_do_uzycia = std::min(n, m); if (!check(plecaki_do_uzycia)) printf("NIE\n"); else { int beg = 1; int end = plecaki_do_uzycia; while (end - beg > 1) { int centre = (beg + end + 1) / 2; if (check(centre)) end = centre; else beg = centre; } printf("%d\n", (beg+end+1)/2); } return 0; } |
English