最大化一个数组的总和,同时保持其他数组的相应元素之和小于k

时间:2015-07-04 06:51:25

标签: arrays algorithm language-agnostic

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

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

示例:

阵列1:2 2 5 4 3 6 10

阵列2:4 3 2 5 4 10 7和k = 15

所有数字都是正数。

2 个答案:

答案 0 :(得分:1)

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

虽然使用动态编程可以实现O(n*k)时间复杂度:

dp[i][j] = x表示对于前i个元素,从数组2中选择一些元素,并且数组2的所选元素的总和是j(0 <= j dp[n][j](0 <= j

状态转移方程是尝试是否选择了数组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]&lt; = j&lt; ķ。

    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的大小选择不同的算法。

答案 1 :(得分:0)

数组的每个元素可以是缺失的,因此导致2^N组合被评估。例如,您可以生成从02^N-1的数字,并使用它们各自的位作为此类存在/不存在的指示。

整个解决方案可以通过这个Python一行代码找到(在这里分为三行):

import itertools

a1 = [2, 2, 5, 4, 3, 6, 10]
a2 = [4, 3, 2, 5, 4, 10, 7]
k = 15

print sorted((sum(itertools.compress(a1, s)), s)
    for s in itertools.product([0, 1], repeat=len(a1))
        if sum(itertools.compress(a2, s)) < k)[-1][1]