题解 | #数组分组# 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')