Computer >> Máy Tính >  >> Lập trình >> C ++

Chương trình C ++ để tìm thời gian dài nhất có thể không lớn hơn T để giải quyết mọi vấn đề

Giả sử chúng ta có một mảng A với N phần tử. Có một số khác T. Hãy xem xét Amal đang cố gắng tham gia vào một cuộc thi lập trình. Nó kéo dài trong T phút và trình bày N vấn đề. Anh ấy có A [i] thời gian để giải quyết vấn đề thứ i. Anh ta sẽ chọn không hoặc nhiều vấn đề để giải quyết trong số N vấn đề, sao cho tổng cộng không mất T phút để giải chúng. Chúng tôi phải tìm ra khoảng thời gian dài nhất có thể để giải quyết vấn đề lựa chọn của anh ấy.

Vì vậy, nếu đầu vào là T =17; A =[2, 3, 5, 7, 11], thì kết quả sẽ là 17, bởi vì nếu anh ta chọn bốn bài toán đầu tiên, anh ta mất tổng cộng 2 + 3 + 5 + 7 =17 phút để giải chúng, mà là thời gian dài nhất có thể không quá T phút.

Các bước

Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -

n := size of A
Define an array b of size (n / 2) and c of size (n - n/2)
for initialize i := 0, when i < n / 2, update (increase i by 1), do:
   b[i] := A[i]
for initialize i := n / 2, when i < n, update (increase i by 1), do:
   c[i - n / 2] = A[i]
Define an array B, C
for bit in range 0 to 2^(n/2), increase bit after each iteration, do
   p := 0
   for initialize i := 0, when i < n / 2, update (increase i by 1), do:
      if bit AND 2^i is non zero, then
         p := p + b[i]
   insert p at the end of B
for bit in range 0 to 2^(n - n/2), increase bit after each iteration
   p := 0
   for initialize i := 0, when i < n - n / 2, update (increase i by 1), do:
      if bit AND 2^i is non-zero, then
         p := p + c[i]
   insert p at the end of C
mx := 0
sort the array C
for initialize i := 0, when i < size of B, update (increase i by 1), do:
   if t - B[i] < 0, then:
      Ignore following part, skip to the next iteration
   itr = next larger element of (t - B[i]) in C
   (decrease itr by 1)
   mx := maximum of mx and (itr + B[i])
return mx

Ví dụ

Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -

#include <bits/stdc++.h>
using namespace std;

int solve(int t, vector<int> A){
   int n = A.size();
   vector<int> b(n / 2), c(n - n / 2);
   for (int i = 0; i < n / 2; i++)
      b[i] = A[i];
   for (int i = n / 2; i < n; i++)
      c[i - n / 2] = A[i];
   vector<int> B, C;
   for (int bit = 0; bit < (1 << (n / 2)); bit++){
      int p = 0;
      for (int i = 0; i < n / 2; i++){
         if (bit & (1 << i))
            p += b[i];
      }
      B.push_back(p);
   }
   for (int bit = 0; bit < (1 << (n - n / 2)); bit++){
      int p = 0;
      for (int i = 0; i < n - n / 2; i++){
         if (bit & (1 << i))
            p += c[i];
      }
      C.push_back(p);
   }
   int mx = 0;
   sort(C.begin(), C.end());
   for (int i = 0; i < B.size(); i++){
      if (t - B[i] < 0)
         continue;
      auto itr = upper_bound(C.begin(), C.end(), t - B[i]);
      itr--;
      mx = max(mx, *itr + B[i]);
   }
   return mx;
}
int main(){
   int T = 17;
   vector<int> A = { 2, 3, 5, 7, 11 };
   cout << solve(T, A) << endl;
}

Đầu vào

17, { 2, 3, 5, 7, 11 }

Đầu ra

17