/*************************************************************************
* 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; } /*************************************************************************/ |
English