我在开始这个特殊的家庭作业问题时遇到了麻烦。这是问题所在:
假设您有一个算法作为黑盒子 - 您无法看到它是如何设计的 - 它具有以下属性:如果您输入任何实数序列和一个整数k,算法将回答YES或NO指示是否有一个数字的子集,其总和正好是k。展示如何使用这个黑盒子找到给定序列X1,...,Xn的子集,其和为k。你可以使用黑匣子O(n)次。
我认为应该首先对序列进行排序,并且任何< k应该只考虑。任何帮助入门将不胜感激。感谢。
答案 0 :(得分:1)
排序是错误的方法。以这种方式思考:如何使用oracle来确定集合中的特定项目是否是总和的一部分?一旦你知道该项是否是总和的一部分,你如何使用oracle来确定其他项是否是总和的一部分?
答案 1 :(得分:-1)
黑盒子是这样的,在C#中(忽略我使用int而不是实际序列,它对问题无关紧要)。
bool blackbox(List<int> subSequence, int k)
{
// unknown
}
您的任务是传递序列的子集并查找序列的哪个部分等于k
。
从整个序列开始,只是看看k
是否在其中。
然后,如果它包含k
,请尝试子序列以查看该子序列是否包含k
。
重复,直到您有包含k
的子序列。