#include <iostream> #include <algorithm> using namespace std; int itemsCount, packsCount; long int items[25]; long int packs[101]; long long packed[25]; int currentPacks = 0; bool answer = false; bool insert( int pack, int item ) { // cout << " . ins item[" << item << "]: " << items[item] << " pack[" << pack << "] " << packs[pack]; if ( (long long int)packed[pack] + items[item] > packs[pack] ) { // cout << " false" << endl; return false; } // cout << " ok" << endl; if ( packed[pack] == 0 ) { ++currentPacks; // cout << "+ " << currentPacks << endl; } // cout << " . was: " << packed[pack] << endl; packed[pack] += items[item]; // cout << " . is: " << packed[pack] << endl; return true; } void remove( int pack, int item ) { packed[pack] -= items[item]; if ( packed[pack] == 0 ) { --currentPacks; // cout << "- " << currentPacks << endl; } } void go(int startingItem) { if ( startingItem >= itemsCount ) { packsCount = min(packsCount, currentPacks); answer = true; return; } for ( int j = 0; j < packsCount; ++j ) { // cout << endl; // cout << " exec " << startingItem << " " << j << endl; if ( insert(j, startingItem) ) { go( startingItem + 1 ); remove(j, startingItem); } } } int main() { cin >> itemsCount >> packsCount; for ( int i = 0; i < 25; ++i) packed[i] = 0; for ( int i = 0; i < itemsCount; ++i ) { cin >> items[i]; } for ( int i = 0; i < packsCount; ++i ) { cin >> packs[i]; } sort(packs, packs + packsCount, greater<int>() ); sort(items, items + itemsCount, greater<int>() ); packsCount = min(itemsCount, packsCount); // cout << "plecaki" << endl; // for ( int i = 0; i < packsCount; ++i ) // { // cout << " " << packs[i]; // } // cout << endl; // cout << "itemy" << endl; // for ( int i = 0; i < itemsCount; ++i ) // { // cout << " " << items[i]; // } // cout << endl; go(0); if ( answer ) cout << packsCount << endl; else cout << "NIE" << 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 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | #include <iostream> #include <algorithm> using namespace std; int itemsCount, packsCount; long int items[25]; long int packs[101]; long long packed[25]; int currentPacks = 0; bool answer = false; bool insert( int pack, int item ) { // cout << " . ins item[" << item << "]: " << items[item] << " pack[" << pack << "] " << packs[pack]; if ( (long long int)packed[pack] + items[item] > packs[pack] ) { // cout << " false" << endl; return false; } // cout << " ok" << endl; if ( packed[pack] == 0 ) { ++currentPacks; // cout << "+ " << currentPacks << endl; } // cout << " . was: " << packed[pack] << endl; packed[pack] += items[item]; // cout << " . is: " << packed[pack] << endl; return true; } void remove( int pack, int item ) { packed[pack] -= items[item]; if ( packed[pack] == 0 ) { --currentPacks; // cout << "- " << currentPacks << endl; } } void go(int startingItem) { if ( startingItem >= itemsCount ) { packsCount = min(packsCount, currentPacks); answer = true; return; } for ( int j = 0; j < packsCount; ++j ) { // cout << endl; // cout << " exec " << startingItem << " " << j << endl; if ( insert(j, startingItem) ) { go( startingItem + 1 ); remove(j, startingItem); } } } int main() { cin >> itemsCount >> packsCount; for ( int i = 0; i < 25; ++i) packed[i] = 0; for ( int i = 0; i < itemsCount; ++i ) { cin >> items[i]; } for ( int i = 0; i < packsCount; ++i ) { cin >> packs[i]; } sort(packs, packs + packsCount, greater<int>() ); sort(items, items + itemsCount, greater<int>() ); packsCount = min(itemsCount, packsCount); // cout << "plecaki" << endl; // for ( int i = 0; i < packsCount; ++i ) // { // cout << " " << packs[i]; // } // cout << endl; // cout << "itemy" << endl; // for ( int i = 0; i < itemsCount; ++i ) // { // cout << " " << items[i]; // } // cout << endl; go(0); if ( answer ) cout << packsCount << endl; else cout << "NIE" << endl; return 0; } |