我正在学习考试,我们遇到了一系列练习题。这是我努力奋斗的一个人,我希望有人可以帮助解决这个问题的正确方法:
这是我最初解决问题的方法:
决策版本: 要使用决策版本找到最佳解决方案,我会尝试使用各种K,直到得到肯定答案。让我们说优化的解决方案是7,我会尝试:
k=1, no
k=2, no
k=3, no
k=4, no
k=5, no
k=6, no
k=7, yes.
现在我们知道最佳解决方案是7个分档,我们通过按大小从最大到最小排序项目来解决决策版本,并填充从最大到最小填充的区域,然后循环回到区域,直到它们为止不再是集合中的元素。
如果我们有一个最佳解决方案并且我们想要解决决策版本,我会采用最优解决方案返回的二进制数,并在决策版本上运行它以查看它是否返回是。
我以前从来没有真正看到这样的问题所以我不确定应该采用哪种格式。
任何帮助将不胜感激!
答案 0 :(得分:2)
根据决策问题解决优化问题有一个更好的方法,请注意您的解决方案是输入大小的指数(伪多项式,但仍然是指数),因为如果你有一个在T(n)
上运行决策问题的算法,建议的解决方案在O(k*T(n))
中运行,但由于k
实际上是输入大小的指数(你只需要{ {1}}代表它的位数,你有一个指数运行时间。
但是,您可以对问题应用二进制搜索,并且只需要log(k)
调用决策问题算法,以解决优化问题。
现在,如果P = NP,并且这样的算法(用于解决决策问题)存在于多项式时间O(log(k))
中,则解决优化问题将在O(p(n))
中完成 - 这是大小的多项式输入。
二进制搜索会是这样的:
O(p(n) * log(k))
最后一次二进制搜索非常标准,只需k <- 1
while decision_bin_packing(G,k) == false:
k <- k * 2
perform binary search for the smallest value t in [k/2,k] such that decision_bin_packing(G,t)==true
次O(logk)
次调用即可轻松实现。