#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; } |