X,Y
{1,...,100n}
|X|=3n
的{{1}}子集|Y|=7n
。查找A
的{{1}}子集和X
B
子集,以便:两者都不为空,Y
和|A|=|B|
。
sum a_i = sum b_i
集合进行O(n^2)
总和(最大值为\{1,...,100n\}
,即使此1+... +100n
和{{1}不可能不包括所有数字)X
红衣主教(设定大小)(来自上一个项目符号)Y
(布尔)表,其大小为O(n)
,其中行代表基数,列代表数字。因此\{0,1\}
表示我们可以创建基数为O(n) X O(n^2)
的子集,并且该集合的总和为1
现在基本上我需要迭代所有单元格并在每个单元格i
中更新它们。因此,我们最终会得到j
的总体时间复杂度。
我该怎么做?
我想我可以逐行迭代它;这意味着,如果我想要更新单元格O(n)
(含义,一个大小为O(n^4)
的集合T[i,j]
),那么我可以查找一组大小i
加上一些等于j
的术语。
BUT!可能是我们已经在前一集中使用了这个术语(大小为i-1
) - 问题!
答案 0 :(得分:1)
你快到了。您的动态编程应包含另一个参数:
允许将DP[K,J,I]
定义为总和为K
的第一个I
元素的大小为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]