#include <cstdio>
#include <algorithm>
using namespace std;
int pack[123];
int object[25];
unsigned int sum[25];
bool B[26];
int n, m, inUse;
void put(int o, int p, int packed);
void next(int o, int p, int packed) {
for(int i = o; i < n; ++i)
if(!B[i]) {
B[i] = true;
put(i, p, packed);
B[i] = false;
}
}
void put(int o, int p, int packed) {
if(p == inUse)
return;
if(pack[p] < object[o]) {
B[o] = false;
next(0, p + 1, packed);
return;
}
/*if(pack[p] >= sum[o]) {
for(int i = o + 1; i < n; ++i)
B[i] = true;
packed += n - o;
}*/
if(packed == n - 1) {
inUse = inUse < p ? inUse : p;
return;
}
pack[p] -= object[o];
next(o + 1, p, packed + 1);
pack[p] += object[o];
}
int main() {
scanf("%d%d", &n, &m);
inUse = min(n, m);
for(int i = 0; i < n; ++i)
scanf("%d", object + i);
for(int i = 0; i < m; ++i)
scanf("%d", pack + i);
sort(pack, pack + m, [](int a, int b) { return a > b; });
sort(object, object + n);
for(int i = n; i; --i)
sum[i - 1] = object[i - 1] + sum[i];
next(0, 0, 0);
if(inUse == min(n, m))
printf("NIE\n");
else
printf("%d\n", inUse + 1);
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 | #include <cstdio> #include <algorithm> using namespace std; int pack[123]; int object[25]; unsigned int sum[25]; bool B[26]; int n, m, inUse; void put(int o, int p, int packed); void next(int o, int p, int packed) { for(int i = o; i < n; ++i) if(!B[i]) { B[i] = true; put(i, p, packed); B[i] = false; } } void put(int o, int p, int packed) { if(p == inUse) return; if(pack[p] < object[o]) { B[o] = false; next(0, p + 1, packed); return; } /*if(pack[p] >= sum[o]) { for(int i = o + 1; i < n; ++i) B[i] = true; packed += n - o; }*/ if(packed == n - 1) { inUse = inUse < p ? inUse : p; return; } pack[p] -= object[o]; next(o + 1, p, packed + 1); pack[p] += object[o]; } int main() { scanf("%d%d", &n, &m); inUse = min(n, m); for(int i = 0; i < n; ++i) scanf("%d", object + i); for(int i = 0; i < m; ++i) scanf("%d", pack + i); sort(pack, pack + m, [](int a, int b) { return a > b; }); sort(object, object + n); for(int i = n; i; --i) sum[i - 1] = object[i - 1] + sum[i]; next(0, 0, 0); if(inUse == min(n, m)) printf("NIE\n"); else printf("%d\n", inUse + 1); return 0; } |
English