这是背包问题的一个例子吗?

问题描述 投票:-1回答:1

我有一个看似简单的问题,但我正在努力解决。转向Google,看来这可能是背包问题的一个变体,但我在将这些解决方案映射到此特定问题时遇到了麻烦。

比方说,我有两个正整数列表,A和B。我想找到代表这两个列表之间最大公共和的值。

A: [6, 1]
B: [5, 3, 1]

这里答案是6,因为这是两个列表中可以共同创建的最大和(通过删除列表A中的1和删除列表B中的3)。

我可以在O(2 ^ n)中天真地解决这个问题,但我假设通过动态编程有一种效率更高的方法,尽管dp不是我的强项。

这是背包问题吗?关于如何将经典背包问题映射到此两列表问题的任何指示?

algorithm knapsack-problem
1个回答
3
投票

这可以在O(nW)中解决,其中n是所有元素的计数,W是列表中所有元素的总和。

分别处理每个列表。如果存在第一个列表的前dp1[i][j]个元素的子集,且其总和等于ij0 <= i <= n1),则使0 <= j <= W1为真。 dp1可以使用递归公式填充:

  • [dp1[0][0]true
  • [dp1[0][j]falsej != 0
  • EDITdp1[i][0]truei != 0
  • dp1[i][j]true,如果:
    • ([j >= list.get(i) AND dp[i - 1][j - list.get(i)]true
    • dp[i - 1][j]true

然后为第二个列表填充dp2[i][j]。然后只需找到Sdp1[n1][S]均为dp2[n2][S]的最大数量true

© www.soinside.com 2019 - 2024. All rights reserved.