Algorithm 寻找两个子集的动态规划

Algorithm 寻找两个子集的动态规划,algorithm,dynamic-programming,computer-science,Algorithm,Dynamic Programming,Computer Science,设X,Y的{1,…,100n}子集,其中|X |=3n和|Y |=7n。查找X的A子集和Y的B子集,以便:两者都不是空的,A |=| B |和求和A|i=求和B|i 有O(n^2)我们可以对集合{1,…,100n\}进行求和(最大的一个是1+…+100n,尽管这一个不可能,因为X和Y不包括所有的数字) 每个总和都有O(n)基数(设置大小)(来自上一个项目符号) 我们可以有一个\{0,1\}(布尔)表,其大小为O(n)xo(n^2),其中行表示基数,列表示数字。所以1意味着我们可以创建一个基数为

X,Y
{1,…,100n}
子集,其中
|X |=3n
|Y |=7n
。查找
X
A
子集和
Y
B
子集,以便:两者都不是空的,
A |=| B |
求和A|i=求和B|i

  • O(n^2)
    我们可以对集合
    {1,…,100n\}
    进行求和(最大的一个是
    1+…+100n
    ,尽管这一个不可能,因为
    X
    Y
    不包括所有的数字)
  • 每个总和都有
    O(n)
    基数(设置大小)(来自上一个项目符号)
  • 我们可以有一个
    \{0,1\}
    (布尔)表,其大小为
    O(n)xo(n^2)
    ,其中行表示基数,列表示数字。所以
    1
    意味着我们可以创建一个基数为
    i
    的子集,集合的和为
    j
  • 第一行/第一列当然很容易计算
现在基本上我需要迭代所有单元格,并在每个单元格的
O(n)
中更新它们。因此,我们最终的总体时间复杂度为
O(n^4)

我该怎么做

我想我可以逐行迭代它;意思是,如果我想更新单元格
T[I,j]
(意思是,一个大小为
I
j
的集合),那么我可以寻找一个大小为
I-1
的集合,加上一个等于
j
的术语


但是!这可能是因为我们在之前的集合中已经使用了这个术语(大小
i-1
)-问题

你就快到了。动态规划应包含另一个参数:

让我们定义
DP[K,J,I]
为第一个
I
元素的大小为
K
的子集的数量,这些元素和
J
相加。这种动态规划的思想是,对于集合中的每个元素
i
,我们检查这两种情况——将其添加到子集,而不添加它

DP[0,0,i] = 1
DP[k,j,0] = 0
DP[k,j,i] = DP[k-1,j-S[i],i-1] or DP[k,j,i-1]

非常感谢你!