#include<iostream> #include<vector> #include<algorithm> #include<cmath> #include<numeric> #include<string> typedef unsigned long long ull; int main(int argc, char** argv) { std::ios_base::sync_with_stdio(false); std::vector<ull> weights, capacities; int itemsCount, backpacksCount; int res(-1); std::cin>>itemsCount>>backpacksCount; for(int i = 0; i < itemsCount; ++i) { ull w; std::cin>>w; weights.push_back(w); } for(int i = 0; i < backpacksCount; ++i) { ull c; std::cin>>c; capacities.push_back(c); } std::sort(weights.begin(), weights.end()); if(std::accumulate(weights.begin(), weights.end(), 0UL) > std::accumulate(capacities.begin(), capacities.end(), 0UL)) { std::cout<<"NIE"; return 0; } std::vector<ull> solution; do { solution = capacities; bool solutionCorrect = true; int tmpRes = 0; std::vector<bool> backpacksUsed(backpacksCount, false); for(int i = 0; i < itemsCount && solutionCorrect; ++i) { bool usedThisItem = false; for(int j = 0; j < backpacksCount; ++j) { if(solution[j] >= weights[i]) { usedThisItem = true; solution[j] -= weights[i]; if(!backpacksUsed[j]) { backpacksUsed[j] = true; tmpRes++; if(res != -1 && tmpRes >= res) { solutionCorrect = false; } } break; } } if(!usedThisItem) { solutionCorrect = false; } } if(solutionCorrect) { res = res == -1?tmpRes:std::min(res, tmpRes); } if(res == 1) { break; } }while(std::next_permutation(weights.begin(), weights.end())); if(res == -1) std::cout<<"NIE"; else std::cout<<res; 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 | #include<iostream> #include<vector> #include<algorithm> #include<cmath> #include<numeric> #include<string> typedef unsigned long long ull; int main(int argc, char** argv) { std::ios_base::sync_with_stdio(false); std::vector<ull> weights, capacities; int itemsCount, backpacksCount; int res(-1); std::cin>>itemsCount>>backpacksCount; for(int i = 0; i < itemsCount; ++i) { ull w; std::cin>>w; weights.push_back(w); } for(int i = 0; i < backpacksCount; ++i) { ull c; std::cin>>c; capacities.push_back(c); } std::sort(weights.begin(), weights.end()); if(std::accumulate(weights.begin(), weights.end(), 0UL) > std::accumulate(capacities.begin(), capacities.end(), 0UL)) { std::cout<<"NIE"; return 0; } std::vector<ull> solution; do { solution = capacities; bool solutionCorrect = true; int tmpRes = 0; std::vector<bool> backpacksUsed(backpacksCount, false); for(int i = 0; i < itemsCount && solutionCorrect; ++i) { bool usedThisItem = false; for(int j = 0; j < backpacksCount; ++j) { if(solution[j] >= weights[i]) { usedThisItem = true; solution[j] -= weights[i]; if(!backpacksUsed[j]) { backpacksUsed[j] = true; tmpRes++; if(res != -1 && tmpRes >= res) { solutionCorrect = false; } } break; } } if(!usedThisItem) { solutionCorrect = false; } } if(solutionCorrect) { res = res == -1?tmpRes:std::min(res, tmpRes); } if(res == 1) { break; } }while(std::next_permutation(weights.begin(), weights.end())); if(res == -1) std::cout<<"NIE"; else std::cout<<res; return 0; } |