问题:
鉴于一系列的整数,是否有可能选择一组 整数,这样该组就可以与给定目标相加 附加约束:如果选择数组中的值 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
在这种情况下,无法真正发现导致其失败的原因。
答案 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
}