C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++でのワインの販売による最大の利益


問題の説明

n個のワインが連続して与えられ、整数はそれぞれ各ワインのコストを示します。毎年、列の最初または最後のワインを販売できます。ワインの価格は時間とともに上昇します。ワインからの初期利益をP1、P2、P3…Pnとします。 Y年目には、i番目のワインからの利益はY*Piになります。毎年、あなたの仕事は、最初または最後のワインを販売する必要があるかどうかを示す開始または終了を印刷することです。また、すべてのワインから最大の利益を計算します。

If wine prices are {2, 4, 6, 2, 5} then output will be:
start end end start start
Maximum profit = 64

アルゴリズム

動的計画法を使用してこの問題を解決できます-

  • アイデアは、各状態に最適なアクションを保存し、それを使用して初期状態から開始して最適な状態をナビゲートすることです。

#include <bits/stdc++.h>
using namespace std;
#define N 1000
int dp[N][N];
int sell[N][N];
int maxProfitUtil(int price[], int begin, int end, int n) {
   if (dp[begin][end] != -1) {
      return dp[begin][end];
   }
   int year = n - (end - begin);
   if (begin == end) {
      return year * price[begin];
   }
   int x = price[begin] * year + maxProfitUtil(price, begin + 1, end, n);
   int y = price[end] * year + maxProfitUtil(price, begin, end - 1, n);
   int ans = max(x, y);
   dp[begin][end] = ans;
   if (x >= y) {
      sell[begin][end] = 0;
   } else {
      sell[begin][end] = 1;
   }
   return ans;
}
int maxProfit(int price[], int n) {
   for (int i = 0; i < N; i++) {
      for (int j = 0; j < N; j++) {
         dp[i][j] = -1;
      }
   }
   int ans = maxProfitUtil(price, 0, n - 1, n);
   int i = 0, j = n - 1;
   while (i <= j) {
      if (sell[i][j] == 0) {
         cout << "start ";
         i++;
      } else {
         cout << "end ";
         j--;
      }
   }
   cout << endl;
   return ans;
}
int main() {
   int price[] = { 2, 4, 6, 2, 5 };
   int n = sizeof(price) / sizeof(price[0]);
   int ans = maxProfit(price, n);
   cout << "Maximum profit = " << ans << endl;
   return 0;
}

出力

上記のプログラムをコンパイルして実行する場合。次の出力を生成します-

start end end start start
Maximum profit = 64

  1. C++でのジョブスケジューリングの最大利益

    n個の異なるタスクがあり、すべてのタスクがstartTime[i]からendTime[i]まで実行されるようにスケジュールされていると仮定します。そのタスクでは、利益[i]を得ることができます。 startTime、endTime、および利益のリストがわかっているので、時間範囲が重複するサブセットに2つのタスクがないように、取得できる最大の利益を見つける必要があります。時間Xで終了するタスクを選択すると、時間Xで開始する別のタスクを開始できます。 したがって、入力がstartTime =[1,2,3,3]の場合、endTime=[3,4,5,6]利益=[500,100,400,700]

  2. C++でフォレストを均一にするためのツリーからの最大エッジ除去

    問題の説明 頂点の数が偶数である無向ツリーの場合、結果のフォレストの連結成分ごとに頂点の数が偶数になるように、このツリーから最大数のエッジを削除する必要があります。 例 上に示したツリーでは、接続された各コンポーネントが偶数の頂点を持つように、赤で示された最大2つのエッジ0-2と0-4を削除できます。 アルゴリズム ツリーが接続されているときに、任意の開始ノードからDFSを実行します 現在のノードの下にルート化されたサブツリー内のノードの数を0として初期化します 現在のノードのすべてのサブツリーに対して再帰的にフォローする- 現在のサブツリーのサイズが偶数の場合、サブツリーを切断で