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

C ++で長さp、q、rのセグメント数を最大化します


問題の説明

長さLのロッドが与えられた場合、タスクは、長さp、q、およびrのセグメントの総数が最大になるようにロッドを切断することです。セグメントの長さはp、q、およびrのみです

l =15、p =2、q =3、r =5の場合、次のように7つのセグメントを作成できます-

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

アルゴリズム

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

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

#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;
}

出力

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

Number of segments = 7

  1. C++で指定された桁数と桁数の合計で最大の数値を検索します

    この問題では、2つの整数値が与えられます。Nは数値の桁数を示し、sumは数値の桁の合計を示します。私たちのタスクは、指定された桁数と桁数の合計で最大の数を見つけることです 。 問題を理解するために例を見てみましょう Input : N = 3, sum = 15 Output : 960 ソリューションアプローチ この問題を解決する簡単な方法は、N桁の数字すべてを最大から最小までトラバースすることです。合計が数値を返すのと等しい場合は、数字の合計数を見つけます。 例 ソリューションの動作を説明するプログラム #include <iostream> using namespa

  2. C++を使用してサッカーの五角形と六角形の数を見つける

    ご存知のように、五角形と六角形はサッカーの重要な部分です。これらの形状は、完全な球形を形成するためのパズルのように組み合わされます。ですから、ここにサッカーがあり、六角形と五角形を見つける必要があります。 問題を簡単に解決するためにオイラー標数を使用します。オイラー標数は、位相空間の特定の形状または構造を記述するために機能する数値です。したがって、サッカーの五角形と六角形の数を計算するために使用できます。 オイラー標数- chi(S) −比表面積Sの整数 F −顔 G −グラフ V −頂点 E −エッジはSに埋め込まれています。 V - E + F