来自工作的朋友向我展示了一个有趣的子集和问题变体:
给定S的正整数,大小为n,整数a和K,是否有一个子集R(集合S)包含正好是元素,其总和等于K +
他声称这可以用时间复杂度O(nka)来完成,我无法想出一个能够实现这个运行时间的动态编程算法。可以吗?
答案 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)