题解 | #数组分组#
//稍作分析得知,我们要求一个数,这个数满足等于非3非5的倍数之和减去5的倍数和3的倍数的差值的一半,也即求的数x=[非3非5之和+(5倍数之和和3倍数之和的差值)]/2,如果在非3非5数组中能找到若干个元素之和等于x则结果为true,否则false
let arr2=[],flag=false
while(line = await readline()){
arr2.push(line)
}
let line1 =arr2[1].split(' ').map(Number)
let arr3=[],arr4=[],arr5=[],x1=0,x3=0,x5=0
for(let item of line1){
if(item%5===0) arr5.push(item),x5+=item //将5的倍数分组,并且求和
else if(item%3===0) arr3.push(item),x3+=item//将3的倍数分组,并且求和
else arr4.push(item),x1+=item//将既不是5的倍数也不是3的倍数分组,并且求和
}
if((x1+x3-x5)%2!==0||(x1+x5-x3)%2!==0){//如果这个数不是整数则结果为false,因为输入数据中只含整数
return console.log(false)
}
func(arr4,0,(x1+x3-x5)/2)//执行一次3的倍数减去5的倍数
func(arr4,0,(x1+x5-x3)/2)//执行一次5的倍数减去3的倍数
console.log(flag)//输出结果
function func(arr,res,target){
if(res==target) return flag=true
if(!flag){//如果已经找到这个数则不再执行后面的程序
for(let i=0;i<arr.length;i++){
let arr1 =arr.slice()
arr1.splice(i,1)
if(res==0){
func(arr1,arr[i],target)
}else{
func(arr1,res+arr[i],target)
}
}
}
}