欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 金融 > 1. 数字王国之军训排队(py)

1. 数字王国之军训排队(py)

2025/9/18 7:04:59 来源:https://blog.csdn.net/2301_82121799/article/details/144748941  浏览:    关键词:1. 数字王国之军训排队(py)

问题描述

数字王国开学了,它们也和我们人类一样有开学前的军训,现在一共有 nn 名学生,每个学生有自己的一个名字 aiai​(数字王国里的名字就是一个正整数,注意学生们可能出现重名的情况),此时叛逆教官来看了之后感觉十分别扭,决定将学生重新分队。

排队规则为:将学生分成若干队,每队里面至少一个学生,且每队里面学生的名字不能出现倍数关系(注意名字相同也算是倍数关系)。

现在请你帮忙算算最少可以分成几队?

例:有 44 名学生 (2,3,4,4)(2,3,4,4),最少可以分成 (2,3)(2,3)、(4)(4)、(4)(4) 共 33 队。

输入格式

第一行包含一个正整数 nn,表示学生数量。

第二行包含 nn 个由空格隔开的整数,第 ii 个整数表示第 ii 个学生的名字 aiai​。

输出格式

输出共 11 行,包含一个整数,表示最少可以分成几队。

样例输入

4
2 3 4 4

样例输出

3

评测数据规模

对于所有评测数据,1≤n≤101≤n≤10,1≤ai≤1051≤ai​≤105。


感觉和枚举子集很像。直接暴力

def check(n, grou):for i in grou:if i % n == 0 or n % i == 0:return Falsereturn Truedef find(deep, n):if deep == n: # 当到达规定的深度时(就是找遍了所有的学生)global ans # 全局变量ans = min(ans, len(num))# 找到最小的方案数(现在的方案数和之前存储在ans的最小方案数比较)return if len(num) > ans: # 剪枝,如果此时的方案数已经比之前的大return for epoch in num: # 遍历存储在num里的分组if check(student[deep], epoch): # 判断该学生可不可以加入该组epoch.append(student[deep]) # 如果可以,加入find(deep+1, n)# 考虑下一个学生该加入哪一组epoch.pop()# 退出num.append([student[deep]]) # 如果有学生不能加入任何一组,就一个人一组find(deep+1, n)num.pop()if __name__ == "__main__":ans = float("inf") # 无限大的数n = int(input())  # 输入student = list(map(int, input().split()))num = [] # 用来存储所有方案find(0, n)print(ans)

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词