/************************************************************************* * Zadanie: Pakowanie * * Zlozonosc czasowa: O(m n^m) * * Wynik: --/10 * *************************************************************************/ #include <iostream> #include <vector> #include <algorithm> #define FOR(i,b,e) for(int i=(b); i <= (e); ++i) #define SIZE(c) (int) (c).size() #define FOREACH(i,c) FOR(i,0,SIZE(c)-1) #define PB push_back using namespace std; vector < int > C; //dostepne kontenery vector < int > I; //przedmioty typedef long long int LLI; /*************************************************************************/ bool try_to_pack(int k) //probuje teraz zapakowac k-ty przedmiot { if (k == SIZE(I)) return 1; FOREACH(i,C) { if (C[i] >= I[k]) { C[i] -= I[k]; if (try_to_pack(k+1)) return 1; C[i] += I[k]; } } return 0; } /*************************************************************************/ int main() { ios_base::sync_with_stdio(0); int n, m; cin >> n >> m; I.resize(n); vector < int > allC(m); LLI item_sum = 0; FOREACH(i,I) { cin >> I[i]; item_sum += I[i]; } FOREACH(i,allC) cin >> allC[i]; sort(allC.begin(), allC.end()); sort(I.begin(), I.end(), greater <int> () ); int i = m-1; LLI c_sum = 0; for( ; i >= 0; --i) { c_sum += allC[i]; C.PB(allC[i]); if (c_sum >= item_sum) break; } if (c_sum < item_sum) { cout << "NIE"; return 0; } for( ; i >= 0; --i) { if (try_to_pack(0)) { cout << (m-i); return 0; } C.PB( allC[i] ); } cout << "NIE"; 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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 | /************************************************************************* * Zadanie: Pakowanie * * Zlozonosc czasowa: O(m n^m) * * Wynik: --/10 * *************************************************************************/ #include <iostream> #include <vector> #include <algorithm> #define FOR(i,b,e) for(int i=(b); i <= (e); ++i) #define SIZE(c) (int) (c).size() #define FOREACH(i,c) FOR(i,0,SIZE(c)-1) #define PB push_back using namespace std; vector < int > C; //dostepne kontenery vector < int > I; //przedmioty typedef long long int LLI; /*************************************************************************/ bool try_to_pack(int k) //probuje teraz zapakowac k-ty przedmiot { if (k == SIZE(I)) return 1; FOREACH(i,C) { if (C[i] >= I[k]) { C[i] -= I[k]; if (try_to_pack(k+1)) return 1; C[i] += I[k]; } } return 0; } /*************************************************************************/ int main() { ios_base::sync_with_stdio(0); int n, m; cin >> n >> m; I.resize(n); vector < int > allC(m); LLI item_sum = 0; FOREACH(i,I) { cin >> I[i]; item_sum += I[i]; } FOREACH(i,allC) cin >> allC[i]; sort(allC.begin(), allC.end()); sort(I.begin(), I.end(), greater <int> () ); int i = m-1; LLI c_sum = 0; for( ; i >= 0; --i) { c_sum += allC[i]; C.PB(allC[i]); if (c_sum >= item_sum) break; } if (c_sum < item_sum) { cout << "NIE"; return 0; } for( ; i >= 0; --i) { if (try_to_pack(0)) { cout << (m-i); return 0; } C.PB( allC[i] ); } cout << "NIE"; return 0; } /*************************************************************************/ |