使用subset-sum oracle确定哪些数字是子集的成员

时间:2013-07-10 01:03:11

标签: algorithm

我在开始这个特殊的家庭作业问题时遇到了麻烦。这是问题所在:

假设您有一个算法作为黑盒子 - 您无法看到它是如何设计的 - 它具有以下属性:如果您输入任何实数序列和一个整数k,算法将回答YES或NO指示是否有一个数字的子集,其总和正好是k。展示如何使用这个黑盒子找到给定序列X1,...,Xn的子集,其和为k。你可以使用黑匣子O(n)次。

我认为应该首先对序列进行排序,并且任何< k应该只考虑。任何帮助入门将不胜感激。感谢。

2 个答案:

答案 0 :(得分:1)

排序是错误的方法。以这种方式思考:如何使用oracle来确定集合中的特定项目是否是总和的一部分?一旦你知道该项是否是总和的一部分,你如何使用oracle来确定其他项是否是总和的一部分?

答案 1 :(得分:-1)

黑盒子是这样的,在C#中(忽略我使用int而不是实际序列,它对问题无关紧要)。

bool blackbox(List<int> subSequence, int k) 
{
  // unknown
}

您的任务是传递序列的子集并查找序列的哪个部分等于k

从整个序列开始,只是看看k是否在其中。 然后,如果它包含k,请尝试子序列以查看该子序列是否包含k。 重复,直到您有包含k的子序列。