描述
输入int型数组,询问该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),不是5的倍数也不是3的倍数能放在任意一组,可以将数组分为空数组,能满足以上条件,输出true;不满足时输出false。
数据范围:每个数组大小满足 1 \le n \le 50 \1≤n≤50 ,输入的数据大小满足 |val| \le 500 \∣val∣≤500
输入描述:
第一行是数据个数,第二行是输入的数据
输出描述:
返回true或者false
示例1
输入:
4 1 5 -5 1
复制输出:
true
复制说明:
第一组:5 -5 1 第二组:1
示例2
输入:
3 3 5 8
复制输出:
false
复制说明:
由于3和5不能放在同一组,所以不存在一种分法。
而这道题,更像是二维的一个递归,因为有两条线要走,要分别同时凑够两条线,
可以这么想,把5的倍数加起来存到sum5,把3的倍数加起来存到sum3,剩下的数存到temp数组里。
然后取sum5-sum3的绝对值,这样只需看数组里的数能否凑出两部分,使其差值是abs(sum5-sum3)。
如果可以构成,就说明可以。
但是重点是怎么用递归表示两条线呢?
我们可以这样想,先把所有的数都加起来,然后再依次减去所有的数,
可以看代码进行分析
let line = parseInt(readline());
let lineArr = readline().split(" ").map(i=>parseInt(i));
let sm5=0;
let sm3=0;
let temp = []
for(let i=0; i<line; i++){
const num = lineArr[i]
if(num%5==0) {
sm5+=num;
}else if(num%3==0) {
sm3+=num;
}else {
temp.push(num)
}
}
const dis0 = Math.abs(sm5-sm3);
function f(i, dis){
if(i==temp.length){
return Math.abs(dis)==dis0;
}
return (f(i+1,dis+temp[i]) || f(i+1,dis-temp[i])); //重点
}
if(f(0,0)){
console.log(true)
}else {
console.log(false)
}
664

被折叠的 条评论
为什么被折叠?



