Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- bool check(int k, int N, int W, vector<int> w){
- // multiset<int> st;
- // for(auto x:w){
- // st.insert(x);
- // }
- vector<int> boxes(k, W);
- vector<int> taken(N, false);
- int box = 0;
- while(box<k){
- bool flag = 0;
- bool flag2 = 1;
- int max_sum = 0, power=0;
- for(int i = 0;i<(1<<N);i++){
- int sum = 0;
- for(int j = 0;j<N;j++){
- if(((i>>j) & 1) && !taken[j]){
- sum+=w[j];
- }
- if(sum> max_sum && sum<=boxes[box]){
- max_sum = max(sum, max_sum);
- power = i;
- flag = true;
- }
- }
- }
- boxes[box]-=max_sum;
- for(int j=0;j<N;j++){
- if(((power>>j) & 1) && !taken[j]){
- taken[j] = 1;
- }
- }
- if(!flag){
- box++;
- }
- for(int i = 0;i<N;i++){
- if(!taken[i]){
- flag2 = false;
- }
- if(flag2){
- break;
- }
- }
- }
- for(int i = 0;i<N;i++){
- if(!taken[i]){
- return false;
- }
- }
- return true;
- }
- int get_minimum_parcels(int N, int W, vector<int> w) {
- // Write your code here. Complete this function to return the minimum number of parcels required by Michael.
- sort(w.begin(), w.end());
- int l = 1, r = N, ans = N;
- while(l<=r){
- int m = (l+r)/2;
- if(check(m, N, W, w)){
- ans = m;
- r = m - 1;
- }else{
- l = m + 1;
- }
- }
- return ans;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement