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]
非常感谢你!