#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <vector>
#include <list>
#include <queue>
#include <set>
#include <map>
#include <numeric>
#include <utility>
#include <string>
#include <sstream>
#include <algorithm>
using namespace std;
const int N = 24;
const int M = 100;
int space[2][1<<N];
int items[N];
int bags[M];
int n, m;
int l;
bool simple() {
return accumulate(items, items + n, 0LL) <= accumulate(bags, bags + m, 0LL);
}
int main() {
scanf("%d%d", &n, &m);
l = 1 << n;
for (int i = 0; i < n; ++i) scanf("%d", items + i);
for (int i = 0; i < m; ++i) scanf("%d", bags + i);
sort(bags, bags + m);
reverse(bags, bags + m);
m = min(n, m);
int b = m;
if (simple()) {
space[1][0] = 0;
for (int s = 1; s < l; ++s) {
space[1][s] = -1;
}
for (b = 0; b < m; ++b) {
const int x = b & 1;
const int y = 1 - x;
for (int s = 0; s < l; ++s) {
space[x][s] = -1;
if (space[y][s] >= 0) {
space[x][s] = bags[b];
continue;
}
for (int si = 1, i = 0; si <= s; si *= 2, ++i) {
if (!(s & si)) continue;
if (space[x][s ^ si] < 0) break;
space[x][s] = max(space[x][s], space[x][s ^ si] - items[i]);
}
}
if (space[x][l - 1] >= 0) break;
}
}
if (b < m) {
printf("%d\n", b + 1);
} else {
printf("NIE\n");
}
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 | #include <cstdio> #include <cstring> #include <cstdlib> #include <cmath> #include <vector> #include <list> #include <queue> #include <set> #include <map> #include <numeric> #include <utility> #include <string> #include <sstream> #include <algorithm> using namespace std; const int N = 24; const int M = 100; int space[2][1<<N]; int items[N]; int bags[M]; int n, m; int l; bool simple() { return accumulate(items, items + n, 0LL) <= accumulate(bags, bags + m, 0LL); } int main() { scanf("%d%d", &n, &m); l = 1 << n; for (int i = 0; i < n; ++i) scanf("%d", items + i); for (int i = 0; i < m; ++i) scanf("%d", bags + i); sort(bags, bags + m); reverse(bags, bags + m); m = min(n, m); int b = m; if (simple()) { space[1][0] = 0; for (int s = 1; s < l; ++s) { space[1][s] = -1; } for (b = 0; b < m; ++b) { const int x = b & 1; const int y = 1 - x; for (int s = 0; s < l; ++s) { space[x][s] = -1; if (space[y][s] >= 0) { space[x][s] = bags[b]; continue; } for (int si = 1, i = 0; si <= s; si *= 2, ++i) { if (!(s & si)) continue; if (space[x][s ^ si] < 0) break; space[x][s] = max(space[x][s], space[x][s ^ si] - items[i]); } } if (space[x][l - 1] >= 0) break; } } if (b < m) { printf("%d\n", b + 1); } else { printf("NIE\n"); } return 0; } |
English