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

Tối đa hóa số đoạn có độ dài p, q và r trong C ++

Tuyên bố vấn đề

Cho một thanh có chiều dài L, nhiệm vụ là cắt thanh sao cho tổng số đoạn có chiều dài p, q và r là cực đại. Các đoạn chỉ có thể có độ dài p, q và r

Nếu l =15, p =2, q =3 và r =5 thì chúng ta có thể tạo thành 7 đoạn như sau -

{2, 2, 2, 2, 2, 2, 3}

Thuật toán

Chúng tôi có thể giải quyết vấn đề này bằng cách sử dụng lập trình động

1. Initialize dp[] array to 0
2. Iterate till the length of the rod. For every i, a cut of p, q and r if possible is done.
3. Initialize ans[i+p] = max( ans[i+p], 1 + ans[i]), ans[i+q] = max(ans[i+q], 1 + ans[i]) and ans[i+r] = max(ans[i+r], 1 + ans[i]) for all the possible cuts.
4. ans[i] will be 0 if a cut at i-th index is not possible. ans[l] will give the maximum number of cuts possible

Ví dụ

#include <bits/stdc++.h>
using namespace std;
int getMaximumSegments(int l, int p, int q, int r){
   int dp[l + 1];
   memset(dp, -1, sizeof(dp));
   dp[0] = 0;
   for (int i = 0; i <= l; ++i) {
      if (dp[i] == -1) {
         continue;
      }
      if (i + p <= l) {
         dp[i + p] = max(dp[i + p], dp[i] + 1);
      }
      if (i + q <= l) {
         dp[i + q] = max(dp[i + q], dp[i] + 1);
      }
      if (i + r <= l) {
         dp[i + r] = max(dp[i + r], dp[i] + 1);
      }
   }
   return dp[l];
}
int main(){
   int l = 15, p = 2, q = 3, r = 5;
   cout << "Number of segments = " << getMaximumSegments(l, p, q, r) << endl;
   return 0;
}

Đầu ra

Khi bạn biên dịch và thực thi chương trình trên. Nó tạo ra kết quả sau−

Number of segments = 7