牛客网HJ93 数组分组

描述

输入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)
}
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值