#define debug if(0) // Grzegorz Guspiel #include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<int(n);++i) #define SIZE(c) ((int)((c).size())) #define FOREACH(i,x) for (__typeof((x).begin()) i=(x).begin(); i!=(x).end(); ++i) #define ALL(v) (v).begin(), (v).end() #define pb push_back #define mp make_pair #define st first #define nd second template<typename T> void maxE(T& a, const T& b) { a = max(a, b); } template<typename T> void minE(T& a, const T& b) { a = min(a, b); } typedef pair<int, int> PII; const int MAXN = 24; const int INF = 1000 * 1000 * 1000 + 100; struct Data { int used, left; Data() {} Data(int used_, int left_): used(used_), left(left_) {} }; bool operator<(const Data& a, const Data& b) { if (a.used == b.used) return a.left > b.left; else return a.used < b.used; } ostream& operator<<(ostream& out, const Data& d) { out << "D(u=" << d.used << ", l=" << d.left << ")"; return out; } Data t[1 << MAXN]; int n, m; vector<int> itemSizes; vector<int> backpackSizes; int solve() { t[0] = Data(0, 0); // ile backpackow uzywam, ile zousedalo w biezacym for (int s = 1; s < (1 << n); s++) { t[s] = Data(INF, INF); REP (i, n) if ((1 << i) & s) { int p = s & ~(1 << i); Data cur; if (itemSizes[i] > t[p].left) { if (t[p].used == m) { continue; } cur = Data(t[p].used + 1, backpackSizes[t[p].used] - itemSizes[i]); } else { cur = Data(t[p].used, t[p].left - itemSizes[i]); } if (cur.left >= 0) { minE(t[s], cur); } } debug cout << "t[" << s << " = " << t[s] << endl; } return t[(1 << n) - 1].used; } int main() { ios_base::sync_with_stdio(0); cin >> n >> m; REP (i, n) { int a; cin >> a; itemSizes.pb(a); } REP (i, m) { int a; cin >> a; backpackSizes.pb(a); } sort(ALL(backpackSizes), greater<int>()); int result = solve(); if (result == INF) cout << "NIE" << endl; else cout << result << endl; 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 82 | #define debug if(0) // Grzegorz Guspiel #include <bits/stdc++.h> using namespace std; #define REP(i,n) for(int i=0;i<int(n);++i) #define SIZE(c) ((int)((c).size())) #define FOREACH(i,x) for (__typeof((x).begin()) i=(x).begin(); i!=(x).end(); ++i) #define ALL(v) (v).begin(), (v).end() #define pb push_back #define mp make_pair #define st first #define nd second template<typename T> void maxE(T& a, const T& b) { a = max(a, b); } template<typename T> void minE(T& a, const T& b) { a = min(a, b); } typedef pair<int, int> PII; const int MAXN = 24; const int INF = 1000 * 1000 * 1000 + 100; struct Data { int used, left; Data() {} Data(int used_, int left_): used(used_), left(left_) {} }; bool operator<(const Data& a, const Data& b) { if (a.used == b.used) return a.left > b.left; else return a.used < b.used; } ostream& operator<<(ostream& out, const Data& d) { out << "D(u=" << d.used << ", l=" << d.left << ")"; return out; } Data t[1 << MAXN]; int n, m; vector<int> itemSizes; vector<int> backpackSizes; int solve() { t[0] = Data(0, 0); // ile backpackow uzywam, ile zousedalo w biezacym for (int s = 1; s < (1 << n); s++) { t[s] = Data(INF, INF); REP (i, n) if ((1 << i) & s) { int p = s & ~(1 << i); Data cur; if (itemSizes[i] > t[p].left) { if (t[p].used == m) { continue; } cur = Data(t[p].used + 1, backpackSizes[t[p].used] - itemSizes[i]); } else { cur = Data(t[p].used, t[p].left - itemSizes[i]); } if (cur.left >= 0) { minE(t[s], cur); } } debug cout << "t[" << s << " = " << t[s] << endl; } return t[(1 << n) - 1].used; } int main() { ios_base::sync_with_stdio(0); cin >> n >> m; REP (i, n) { int a; cin >> a; itemSizes.pb(a); } REP (i, m) { int a; cin >> a; backpackSizes.pb(a); } sort(ALL(backpackSizes), greater<int>()); int result = solve(); if (result == INF) cout << "NIE" << endl; else cout << result << endl; return 0; } |