C++ 程序查找最大可整除对子集

c++server side programmingprogramming

解决给定一个由不同元素组成的数组的问题。现在我们的任务是找到一个子集,使得每对都是均匀可整除的,即每个大元素都可以被每个较小的元素整除。

输入:arr[] = {10, 5, 3, 15, 20}
输出:3
解释:最大的子集是 10、5、20。
10 可以被 5 整除,20 可以被 10 整除。

输入:arr[] = {18, 1, 3, 6, 13, 17}
输出:4
解释:最大的子集是 18、1、3、6,
在子序列中,3 可以被 1 整除,
6 可以被 3 整除,18 可以被 6 整除。

我们将应用动态规划来找到答案这个问题,我们来看看如何解决。

寻找解决方案的方法

在这种方法中,我们将按升序对数组进行排序。现在我们从数组末尾开始遍历数组。现在我们维护一个 dp 数组,该数组将包含第 i 个元素最小的最大子集的大小。然后我们从 dp 数组中返回最大值。

示例

#include <bits/stdc++.h>
using namespace std;
int largestSubsetPair(int *a, int n){
    int dp[n]; // 它将存储从第 i 个索引开始的最大子集
    dp[n - 1] = 1; // 因为最后一个元素最大,所以它的子集大小为 1
    int largest = 0; // ans
    for (int i = n - 2; i >= 0; i--) {
          int maxi = 0; // 取 m​​ax = 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]); // 如果 a[j] 能被 a[i] 整除
                 //因此所有能被 a[j] 整除的元素也应遵循

        dp[i] = 1 + maxi;
        largest = max(largest, dp[i]);
    }
    return largest;
}
int main(){
    int a[] = { 1, 3, 6, 13, 17, 18 }; // 给定数组
    int n = sizeof(a) / sizeof(int); // 数组的大小
    cout << largestSubsetPair(a, n) << "\n";
    return 0;
}

输出

4

上述代码的解释

在这种方法中,我们现在使用动态规划来解决问题。首先,我们现在对数组进行排序。现在,当我们对数组进行排序时,我们创建了一个数组 dp,它将存储所有先前最大的子集。

现在我们从数组的末尾开始。我们首先假设当前元素是最小的,然后检查其他倍数,因为我们在它前面遇到了一个倍数。我们正在反向行进,这意味着我们以前遇到过这个元素。我们现在还在 dp 数组中保存了它们最大的子集大小。我们将这个元素添加到当前元素的 dp 中,这就是我们继续的方式。

结论

在本教程中,我们解决了使用动态规划查找最大可除对子集的问题。我们还学习了这个问题的 C++ 程序以及我们解决这个问题的完整方法(正常)。我们可以用其他语言(如 C、java、python 和其他语言)编写相同的程序。我们希望您觉得本教程有用。


相关文章