之前已经提出过关于相同算法的问题,我找到了我正在寻找的解决方案。然而,我想知道如何修复自己的解决方案以解决以下问题:
给定一组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}。我已经尝试跟踪数据流,但在某些时候我出错了。
感谢您的帮助!
答案 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;
}
我认为必须有一种方法可以避免重复的代码行,但只要它能够正常工作,我就会感到高兴。