递归,将int []拆分为限制下的两个组

时间:2015-03-19 15:52:19

标签: java recursion

之前已经提出过关于相同算法的问题,我找到了我正在寻找的解决方案。然而,我想知道如何修复自己的解决方案以解决以下问题:

  

给定一组int,是否可以将整数划分为两组,以便两组的总和相同,具有这些约束:所有5的倍数值必须在一个组中,并且所有3的倍数(而不是5的倍数)的值必须在另一个中。

我提出的解决方案如下:

public boolean split53(int[] nums) {
  return isPossible(nums,0,0,0);
}
public boolean isPossible(int[] nums,int start,int sum3,int sum5) {
  if(start>=nums.length) return sum3==sum5;
  int tmp=nums[start];

  if(isPossible(nums,start+1,sum3+tmp,sum5)) return true;
  if(isPossible(nums,start+1,sum3,sum5+tmp)) return true;

  if(nums[start]%5==0) {
    sum5+=nums[start];
    tmp=nums[start++];
  }
  else if(nums[start]%3==0) {
    sum3+=nums[start]; 
    tmp=nums[start++];
  }  
  if(start>=nums.length) return sum3==sum5;

  return false;
}

它适用于大多数情况,但不知何故它不适用于nums = {3,5,8}。我已经尝试跟踪数据流,但在某些时候我出错了。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

睡了之后我想出了以下工作方案:

public boolean split53(int[] nums) {
  return isPossible(nums,0,0,0); 
}
public boolean isPossible(int[] nums,int start,int sum3,int sum5) {
  if(start>=nums.length) return sum3==sum5;
  int tmp=nums[start];

  if(tmp%5==0 || tmp%3==0) {
    if(nums[start]%5==0) {
      if(isPossible(nums,start+1,sum3,sum5+tmp)) return true;
    }
    else if(nums[start]%3==0) {
      if(isPossible(nums,start+1,sum3+tmp,sum5)) return true;
    }  
  } else {
    if(isPossible(nums,start+1,sum3+tmp,sum5)) return true;
    if(isPossible(nums,start+1,sum3,sum5+tmp)) return true;
  }
  return false;
}

我认为必须有一种方法可以避免重复的代码行,但只要它能够正常工作,我就会感到高兴。