分割等和子集变种 比如{1,5,11,5,1,5,2} 最大能划分几种相同的部分publicclasstest1{publicstaticvoidmain(String[]args){inta[]newint[]{1,5,11,5,1,5,2};intsum0;for(intx:a)sumx;intmaxK1;for(intka.length;k1;k--){if(sum%k!0)continue;inttargetsum/k;intmaxNum0;for(intnum:a)maxNumMath.max(maxNum,num);if(maxNumtarget)continue;if(canPart(a,k,target)){maxKk;break;}}System.out.println(最大能分成 maxK 个和相等的子集);}privatestaticbooleancanPart(int[]a,intk,inttarget){Integer[]arrnewInteger[a.length];for(inti0;ia.length;i)arr[i]a[i];Arrays.sort(arr,(a1,b)-b-a1);boolean[]usednewboolean[a.length];returnbacktrack(arr,used,k,target,0,0);}privatestaticbooleanbacktrack(Integer[]nums,boolean[]used,intk,inttarget,intcurrentSum,intstart){if(k0)returntrue;if(currentSumtarget)returnbacktrack(nums,used,k-1,target,0,0);for(intistart;inums.length;i){if(!used[i]currentSumnums[i]target){//前一个数字没用过。且和当前数字相等 剪枝if(i0nums[i].equals(nums[i-1])!used[i-1]){continue;}used[i]true;if(backtrack(nums,used,k,target,currentSumnums[i],i1)){returntrue;}used[i]false;// if(currentSum0) break;if(currentSumnums[i]target)break;}}returnfalse;}}