子集和问题的有趣变化

时间:2010-11-02 10:18:59

标签: algorithm complexity-theory dynamic-programming np-hard

来自工作的朋友向我展示了一个有趣的子集和问题变体:

给定S的正整数,大小为n,整数a和K,是否有一个子集R(集合S)包含正好是元素,其总和等于K +

他声称这可以用时间复杂度O(nka)来完成,我无法想出一个能够实现这个运行时间的动态编程算法。可以吗?

2 个答案:

答案 0 :(得分:3)

如果k和a足够小,可以完成,这样我们就可以声明一个数组

bool found[a][k]

您将迭代S中的每个值并迭代找到的数组中的每个状态以获得新状态。

对于a = 1和k = 7的索引,以及S的当前值为7,

如果发现[1] [7]为真,那么你也可以确定找到[2] [14]也是如此。

当迭代结束时,您需要做的就是检查[a] [k]是否为真。

答案 1 :(得分:3)

设S = {s1,\ ldots,sn}

如果可以在s1,\ ldots,sj中找到总和为K的元素,则设P(j,K,a)为真。

然后P(j,K,a)= P(j-1,K-sj,a-1)或P(j,K,a)(需要sj或者不需要sj。)

该算法包括用K + 1填充维数n的3-D表格+ 1。每个条目需要恒定的时间来填充,因此时间(和空间)复杂度为O(nKa)