题解 | #kotori和素因子#

kotori和素因子

https://www.nowcoder.com/practice/7b1c858a3e7a41ed8364178979eaae67?tpId=308&tqId=500564&ru=/exam/oj&qru=/ta/algorithm-start/question-ranking&sourceUrl=%2Fexam%2Foj%3Fpage%3D1%26tab%3D%25E7%25AE%2597%25E6%25B3%2595%25E7%25AF%2587%26topicId%3D308

import sys
import copy

"""
定义L2接收素因子列表
"""
L2 = []
n = int(input())
numbers = list(map(int, input().split()))


def isprime(x):
    """
    判断x是否为素数
    """
    if x == 2:
        return True
    i = 2
    while i < x:
        if x % i == 0:
            return False
        i += 1
        return True


def suyinzi(x):
    """
    先判断i是否是x的因子,然后判断是否是素数,如果是说明是x的素因子,加入到L中,并去重
    """
    L = []
    i = 2
    while i < x:
        if x % i == 0:
            x = int(x / i)
            if isprime(i):
                L.append(i)
        else:
            i += 1
    L.append(x)
    L = list(set(L))
    L.sort()
    return L


# 遍历整数,求出每个整数的素因子
for x in numbers:
    L2.append(suyinzi(x))

L = copy.deepcopy(L2)
#print(L)
L2 = []


for x in L:
    for element in x:
        if element not in L2:
            L2.append(element)

#递归的初始状态为以下,depth是深度,代表进入到第几个整数的素因子选择
sum = 0
visited = [False for i in range(len(L2))]
depth = 0
res = []


def dfs(L, L2, visited, sum, depth, res):
    '''
    每进入一层,就选择一个数字,当进入到最后一层,停止递归
    '''

    if depth == n:
        res.append(sum)
        return

    for i in L[depth]:
        #如果在本层没有找到未被访问的素因子,那停止递归返回-1
        if visited[L2.index(i)] == False:
            sum += i
            depth += 1
            visited[L2.index(i)] = True
            #进入递归,深度+1,更新了visited数组,保证没有重复的素因子被选择
            dfs(L, L2, visited, sum, depth, res)
            #回朔
            sum -= i
            depth -= 1
            visited[L2.index(i)] = False
    
    return res


res = dfs(L, L2, visited, sum, depth, res)
if not res:
    print("-1")
else:
    print(min(res))

全部评论

相关推荐

小谷围鸡肉卷阿姨:+1,腾子投完一动不动
点赞 评论 收藏
分享
11-18 15:57
门头沟学院 Java
最终归宿是测开:这个重邮的大佬在重邮很有名的,他就喜欢打92的脸,越有人质疑他,他越觉得爽😂
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务