recursivly确定是否存在与给定的int参数匹配的正int数组的子集和?

时间:2017-06-14 07:17:13

标签: java arrays algorithm recursion backtracking

解决方案应该是递归的,零是任何集合的元素,并且捕获的是你可以多次使用集合的元素。

例如,如果数组是{3,5,7},那么17将返回true,因为5 + 5 + 7 = 17 但是4将返回false。

我试过这个:

public static boolean isSumOf(int [] s, int n)
{
        return isSumOf(s, s.length, n);
}
static boolean isSumOf(int s[], int length, int n)
{
   // Base Cases
   if (n == 0)
   {
       return true;
   }

   if (length == 0 && n != 0)
   {
       return false;
   }

   // If last element is greater than sum, then ignore it
   if (s[length-1] > n)
   {
       return isSumOf(s, length-1, n);
   }


   /* else, check if sum can be obtained by any of the following
      (a) including the last element
      (b) excluding the last element   */
   return isSumOf(s, length-1, n) || isSumOf(s, length-1, n-s[length-1]);
}

但它排除了多次添加元素的能力

3 个答案:

答案 0 :(得分:2)

不要缩短数组,只需遍历循环中的所有值,如下所示:

-1

如果不允许循环,请使用和不使用最后一个元素调用递归(注意我在第二次调用中删除了return isSumOf(s, length-1, n) || isSumOf(s, length, n-s[length-1]); ):

{{1}}

答案 1 :(得分:0)

试试这个。

static boolean isSumOf(int s[], int length, int n) {
   if (n == 0)
       return true;
   if (length == 0)
       return false;
   int last = s[length - 1];
   if (last > n)
       return isSumOf(s, length - 1, n);
   return isSumOf(s, length - 1, n)
       || isSumOf(s, length - 1, n - last)
       || isSumOf(s, length, n - last);
}

结果

int[] array = {3, 5, 7};
int length = array.length;
System.out.println(isSumOf(array, length, 12));  // true
System.out.println(isSumOf(array, length, 5));   // true
System.out.println(isSumOf(array, length, 8));   // true
System.out.println(isSumOf(array, length, 25));  // true
System.out.println(isSumOf(array, length, 4));   // false

答案 2 :(得分:0)

您的实现更多是标准子集和,其中在求和操作期间不允许重复元素。

但你的要求允许重复元素。

  

例如,如果数组是{3,5,7},那么17将返回true,因为5 + 5 + 7 = 17但是4将返回false。

这就是为什么你没有得到结果。正如MBo在总和计算过程中检查所有元素所指出的那样。

注意:如果要求找到所有此类组合,那么它更像是coin exchange problem

希望它有所帮助!