题解 | #数组分组# 11行代码暴力递归求解

数组分组

https://www.nowcoder.com/practice/9af744a3517440508dbeb297020aca86

1、不是3的倍数也不是5的倍数的数字,递归它的每一位,每一个放入3的倍数数组或者5的倍数数组。

2、当所有位递归完则计算3的倍数数组和5的倍数数组,是否相等。

def dfs(_arr_3, _arr_5, i):
    if i == len(arr_other):  # 结算
        return True if sum(_arr_3) == sum(_arr_5) else False
    if dfs(_arr_3 + [arr_other[i]], _arr_5, i + 1) or dfs(_arr_3, _arr_5 + [arr_other[i]], i + 1):
        return True
    else:
        return False
    
n, arr = input(), list(map(int, input().strip().split(' ')))
arr_3, arr_5, arr_other = [i for i in arr if i%3==0 and i%5!=0], [i for i in arr if i%5==0], [i for i in arr if i%3!=0 and i%5!=0]
print('true' if dfs(arr_3, arr_5, 0) else 'false')

看其他人代码学习到的另一种思路:

1、欲得res=arr3-arr5=0,所以直接计算arr3-arr5结果

2、再递归每一个任意组的数,res加它或者减它。遍历完后判断res里是否有为0的结果,有则相等。

def dfs(_res, idx):
    if idx == len(arr_else):
        return True if _res == 0 else False
    if dfs(_res + arr_else[idx], idx + 1) or dfs(_res - arr_else[idx], idx + 1):
        return True
    else:
        return False

n, arr = input(), list(map(int, input().strip().split(' ')))
res = sum([i if i % 3 == 0 and i % 5 != 0 else (-i if i % 5 == 0 else 0) for i in arr])
arr_else = [i for i in arr if i % 3 != 0 and i % 5 != 0]
print('true' if dfs(res, 0) else 'false')

全部评论

相关推荐

07-21 18:43
门头沟学院 Java
是暑期都招满了吗
ANEOY:今年感觉真是后端地狱级难度了,从暑期就是这样,前端需求非常大
点赞 评论 收藏
分享
来个厂收我吧:首先,市场侧求职我不是很懂。 但是,如果hr把这份简历给我,我会觉得求职人不适合做产品经理。 问题点: 1,简历的字体格式不统一,排版不尽如人意 2,重点不突出,建议参考star法则写个人经历 3,印尼官方货币名称为印度尼西亚卢比(IDR),且GMV690000印尼盾换算为305人民币,总成交额不高。 4,右上角的意向职位在发给其他公司时记得删除。 5,你所有的经历都是新媒体运营,但是你要投市场营销岗位,jd和简历不匹配,建议用AI+提示词,参照多个jd改一下经历内容。 修改建议: 1,统一字体(中文:思源黑体或微软雅黑,英文数字:time new romans),在word中通过表格进行排版(b站学) 2,校招个人经历权重:实习经历=创业经历(大创另算)>项目经历>实训经历>校园经历 3,请将项目经历时间顺序改为倒序,最新的放最上方。 4,求职方向不同,简历文字描述侧重点也需要不同。
点赞 评论 收藏
分享
06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务