arrays - 最大化一个数组的总和,同时保持另一数组对应元素的总和小于 k

标签 arrays algorithm language-agnostic

我有两个数组,我必须从第一个数组中选择一些元素,使它们的总和最大化,而第二个数组相应元素的总和小于 k。

到目前为止我能想到一个递归的解决方案,我需要一个迭代的解决方案。

例子:

数组 1 : 2 2 5 4 3 6 10

数组 2 : 4 3 2 5 4 10 7 和 k = 15

所有的数字都是正数。

最佳答案

假设每个数组有 n 个元素。一种解决方案是尝试 n 个元素的所有可能组合,这意味着时间复杂度为 O(2^n) .

而使用动态规划可以实现O(n*k)时间复杂度:

dp[i][j] = x表示对于前i个元素,从数组2中选择一些元素,数组2中被选中元素的和为j(0 <= j < k),数组1中对应被选中元素的最大和为x。然后我们要 dp[n][j] (0 <= j < k) 最大值。

状态转移方程是尝试数组2的第i个元素是否被选中。如果未选择,dp[i][j] = dp[i-1][j] ;如果选中,dp[i][j] 可以是 max(dp[i-1][j], dp[i-1][j-b[i]] + a[i]) , 这里 b[i] <= j < k.

    for(int i=1;i<=n;i++) {
        for(int j=0;j<k;j++) {
            dp[i][j] = 0;
        }
    }
    if(b[1] < k) {
        dp[1][b[0]] = a[0];
    }
    for(i=2;i<=n;i++) {
        for(j=0;j<k;j++) {
            dp[i][j] = dp[i-1][j];
            if(j >= b[i] && dp[i-1][j - b[i]] + a[i] > dp[i][j]) {
                dp[i][j] = dp[i-1][j - b[i]] + a[i];
            }
        }
    }

答案是max(d[[n][j]), 0 <= j< k .

请根据大小选择不同的算法nk是。

关于arrays - 最大化一个数组的总和,同时保持另一数组对应元素的总和小于 k,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31217824/

相关文章:

python - 将多维数组的每个子数组的最后一项放入列表

c++ - 为什么这行得通?不合逻辑的数组访问

language-agnostic - 测试用例 "when"、 "what"和 "why"?

algorithm - 查找数组中的范围

algorithm - 真随机数发生器

arrays - 将特定值移动到随机填充数组的末尾

ios - 如何通过比较swift中的每个字符来排序?

寻找第n个工作日的算法

php - 将 y 元素的 x 列表合并到每个 z 元素的上限的算法

algorithm - 查找 'shortest range of indices' 的大小,查找所有唯一路径都通过