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

最大の分割可能なペアサブセットを見つけるためのC++プログラム


個別の要素で構成される配列が与えられる問題を解決するため。ここでのタスクは、すべてのペアが均等に分割できるようにサブセットを見つけることです。つまり、たとえば、すべての大きな要素がすべての小さな要素で分割可能です。

Input : arr[] = {10, 5, 3, 15, 20}
Output : 3
Explanation: The largest subset is 10, 5, 20.
10 is divisible by 5, and 20 is divisible by 10.

Input : arr[] = {18, 1, 3, 6, 13, 17}
Output : 4
Explanation: The largest subset is 18, 1, 3, 6,
In the subsequence, 3 is divisible by 1,
6 by 3 and 18 by 6.

この問題に対する答えを見つけるために動的計画法を適用し、その方法を見ていきます。

解決策を見つけるためのアプローチ

このアプローチでは、配列を昇順で並べ替えます。ここで、最後から始めて、配列を実行します。ここで、i番目の要素が最小である最大のサブセットのサイズを含むdp配列を維持します。次に、dp配列から最大値を返します。

#include <bits/stdc++.h>
using namespace std;
int largestSubsetPair(int *a, int n){
    int dp[n]; // it is going to store the largest subset starting from ith index
    dp[n - 1] = 1; // as last element is the largest so its subset size is 1
    int largest = 0; // ans
    for (int i = n - 2; i >= 0; i--) {
        int maxi = 0; // taking max = 0;
        for (int j = i + 1; j < n; j++)
            if (a[j] % a[i] == 0 || a[i] % a[j] == 0)
                maxi = max(maxi, dp[j]); // if a[j] is divisible by a[i]
                 //so all the elements divisible by a[j] should also follow

        dp[i] = 1 + maxi;
        largest = max(largest, dp[i]);
    }
    return largest;
}
int main(){
    int a[] = { 1, 3, 6, 13, 17, 18 }; // given array
    int n = sizeof(a) / sizeof(int); // size of our array
    cout << largestSubsetPair(a, n) << "\n";
    return 0;
}

出力

4

上記のコードの説明

このアプローチでは、動的計画法を使用して問題を解決します。まず、配列を並べ替えます。ここで配列を並べ替えたので、以前の最大のサブセットをすべて格納する配列dpを作成しました。

これで、配列の最後から開始します。最初に、現在の要素が最小であると想定し、その前に倍数が発生したときに他の倍数をチェックします。私たちは逆に移動しているので、それは私たちが以前にその要素に遭遇したことを意味します。また、dp配列内に最大のサブセットサイズを保存しました。この要素を現在の要素のdpに追加し、それが続行する方法です。

結論

このチュートリアルでは、動的計画法を使用して最大の除算可能なペアのサブセットを見つけるための問題を解決します。また、この問題のC ++プログラムと、この問題を解決するための完全なアプローチ(通常)についても学びました。同じプログラムを、C、java、python、その他の言語などの他の言語で作成できます。このチュートリアルがお役に立てば幸いです。


  1. C++で三角形の図心を見つけるプログラム

    この問題では、三角形の3つの頂点の座標を示す2D配列が与えられます。私たちのタスクは、C++で三角形のセントロイドを見つけるプログラムを作成することです。 セントロイド 三角形の3つの中央値は、三角形の3つの中央値が交差する点です。 中央値 三角形の頂点は、三角形の頂点とその反対側の線の中心点を結ぶ線です。 問題を理解するために例を見てみましょう 入力 (-3, 1), (1.5, 0), (-3, -4) 出力 (-3.5, -1) 説明 Centroid (x, y) = ((-3+2.5-3)/3, (1 + 0 - 4)/3) = (-3.5, -1) ソリューションアプロ

  2. C++で平行四辺形の面積を見つけるプログラム

    この問題では、平行四辺形の底と高さを表す2つの値が与えられます。私たちのタスクは、C++で平行四辺形の領域を見つけるプログラムを作成することです。 平行四辺形 は、反対側が等しく平行な4辺の閉じた図形です。 問題を理解するために例を見てみましょう 入力 B = 20, H = 15 出力 300 説明 平行四辺形の面積=B* H =20 * 15 =300 ソリューションアプローチ この問題を解決するために、平行四辺形の面積の幾何学的公式を使用します。 Area = base * height. ソリューションの動作を説明するプログラム 例 #include <io