确定在一些整数数组中是否存在一个子集,该子集在几个条件下求和给定目标值

时间:2014-07-19 05:41:47

标签: java arrays

问题:

  

鉴于一系列的整数,是否有可能选择一组   整数,这样该组就可以与给定目标相加   附加约束:如果选择数组中的值   group,数组中紧跟其后的值不得为   选择的。

     

例如: -

     

groupNoAdj(0,{2,5,10,4},12)→true

     

groupNoAdj(0,{2,5,10,4},14)→false

     

groupNoAdj(0,{2,5,10,4},7)→false

正如您在最后一种情况中所看到的那样,虽然存在子集{2,5},它与目标值'7'相加,但它们是相邻值,因此不能一起选择。 还有另一个条件是您无法使用本地变量。

我提出了以下解决方案:

public boolean groupNoAdj(int start, int[] nums, int target) {
    if(start==nums.length)
        return target==0;
    if(start==nums.length-1&&!(target==0))
        return (target-nums[start]==0);


    if(target==0)
       return true;

    if((start<nums.length-1)&&groupNoAdj(start+1, nums, target-nums[start]))
           return groupNoAdj(start+2, nums, target-nums[start]);

   return groupNoAdj(start+1, nums, target);
}

但是如果groupNoAdj(0,{2,5,10,4,2},7)它失败了,当它实际上应该返回true时返回false

在这种情况下,无法真正发现导致其失败的原因。

1 个答案:

答案 0 :(得分:1)

你错过了最后一件事:

public static void main(String[] args) {
    int[] arr1 ={2, 5, 10, 4};
    int[] arr2 = {2, 5, 10, 4};
    System.out.println(groupNoAdj(0, arr1, 12)); // prints true
    System.out.println(groupNoAdj(0, arr2, 7));  // prints false
}

public static boolean groupNoAdj(int start, int[] nums, int target) {

    if(target == 0)
        return true;

    if(start == nums.length)
        return target==0;

    if(start == nums.length-1)
        return target-nums[start] == 0;

    return
            groupNoAdj(start+2, nums, target-nums[start]) || // either pick the "current" item (and skip the "next") 
            groupNoAdj(start+1, nums, target);               // or don't pick it
}