我有两个数组,我必须从第一个数组中选择一些元素,使它们的和最大化,而第二个数组的相应元素之和小于k。
到目前为止,我可以想到一个递归解决方案,我需要一个迭代解决方案。
示例:
阵列1:2 2 5 4 3 6 10
阵列2:4 3 2 5 4 10 7和k = 15
所有数字都是正数。
答案 0 :(得分:1)
假设每个数组都有n个元素。一种解决方案是尝试n个元素的所有可能组合,这意味着时间复杂度为O(2^n)
。
虽然使用动态编程可以实现O(n*k)
时间复杂度:
状态转移方程是尝试是否选择了数组2的第i个元素。如果未选中, 答案是 请根据dp[i][j] = x
表示对于前i个元素,从数组2中选择一些元素,并且数组2的所选元素的总和是j(0 <= j 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
。n
和k
的大小选择不同的算法。
答案 1 :(得分:0)
数组的每个元素可以是缺失的,因此导致2^N
组合被评估。例如,您可以生成从0
到2^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]