Java - 子集和

时间:2016-10-04 02:40:34

标签: java

我被告知编写一个递归函数,它接受一个起始索引,一个整数数组和一个目标和,你的目标是找出整数数组的一个子集是否与目标总和相加。

我给出的例子是groupSum(0,{2,4,8},10)应该返回true,因为2和8加起来是目标,10。所有我能够做到这一点是基本情况。

public boolean groupSum(int start, int[] nums, int target) {
    if (nums.length == 0)
    {
        return false;
    }
    else if (start == nums.length - 1)
    {
        return nums[start] == target;
    }
    else
    {
        ?????
    }
}

我不知道我应该去哪里进行实际的递归调用。由于我无法在通话之间传递集体金额,因此我不知道如何在每次递归通话中添加一个数字,直到我到达目标为止。另外,如示例中所示,我不知道如何在一个数字不能工作时跳过它就能实现我的代码,就像4中的例子所做的那样。我正在思考这个问题。我应该从int目标一次减去一个数字,然后用新的起点和目标的新值递归调用该方法,但我不知道如何使用它来查看是否有一个有效的子集。 / p>

我将不胜感激,可以帮助我了解如何解决这个问题,以便我能够完成它。谢谢!

3 个答案:

答案 0 :(得分:0)

这是一个工作版本。请参阅代码中的注释以获得解释。

public static boolean recursiveSumCheck(int target, int[] set) {
    //base case 1: if the set is only one element, check if element = target
    if (set.length == 1) {
        return (set[0] == target);
    }

    //base case 2: if the last item equals the target return true
    int lastItem = set[set.length - 1];
    if (lastItem == target) {
        return true;
    }

    //make a new set by removing the last item
    int[] newSet = new int[set.length - 1];
    for (int newSetIndex = 0; newSetIndex < newSet.length; newSetIndex++) {
        newSet[newSetIndex] = set[newSetIndex];
    }

    //recursive case: return true if the subset adds up to the target
    //                OR if the subset adds up to (target - removed number)
    return (recursiveSumCheck(target, newSet) || recursiveSumCheck(target - lastItem, newSet));
}

答案 1 :(得分:0)

dynamic programming。也许这会对你有帮助。

答案 2 :(得分:-1)

当你指出你可以改变目标而不是传递集体总和。一旦目标为零,您就知道您已经找到了解决方案(通过选择其余项目的成员)。

所以,在psueduo代码中:

hasMembersThatSumTo(list, total):
    if total == 0
        return true
    else if total < 0 or list is empty
        return false
    else
        int first = list.pop
        return hasMembersThatSumTo(list, total - first)
            or hasMembersThatSumTo(list, total)

&#39;或&#39;中的两个案例声明正在寻找这种情况,其中当前元素是否在总和中。