法一(内置函数法):
使用itertools.combinations
函数从5个数中任选三个数。itertools.combinations
函数返回给定可迭代对象中元素的所有可能组合,无重复且元素顺序不同则视为不同的组合。
import itertools
# 定义你的数字列表
numbers = [1, 2, 3, 4, 5]
# 使用itertools.combinations选择三个数的所有组合
combinations = list(itertools.combinations(numbers, 3))
# 打印结果
for combo in combinations: print(combo)
在此基础上进行推广到从n个数中任选k个数:
import itertools
n,k=map(int,input().split())x=input().split(" ")
number=[]
for i in range(n):number.append(int(x[i]))cmb=list(itertools.combinations(number,k)) #返回一个迭代器,以元组为元素
for c in cmb:print(c)
'''
入:
4 3
3 7 12 19 31
出:
(3, 7, 12)
(3, 7, 19)
(3, 12, 19)
(7, 12, 19)
'''
法二(数据大用递归,数据小用暴力枚举):
还是以5选3为例,循环嵌套的层数取决于选的个数
# 定义包含5个数的列表
numbers = [1, 2, 3, 4, 5] # 初始化一个空列表来存储所有组合
combinations = [] # 外层循环选择第一个数
for i in range(len(numbers)): # 内层第一个循环选择第二个数,注意要跳过已经选过的数 for j in range(i + 1, len(numbers)): # 内层第二个循环选择第三个数,同样要跳过之前选过的数 for k in range(j + 1, len(numbers)): # 将选出的三个数作为元组添加到组合列表中 combinations.append((numbers[i], numbers[j], numbers[k])) # 打印所有组合
for combo in combinations: print(combo)
def combinations_with_loops(numbers, k): # 初始化一个空列表来存储所有组合 combinations = [] # 获取列表长度 n = len(numbers) # 使用递归函数来生成组合 def generate_combinations(start, current_combination): # 如果当前组合的长度等于k,则将其添加到结果列表中 if len(current_combination) == k: combinations.append(tuple(current_combination)) return # 遍历从start开始到列表末尾的所有元素 for i in range(start, n): # 将当前元素添加到组合中,并递归调用以继续添加下一个元素 generate_combinations(i + 1, current_combination + [numbers[i]]) # 从第一个元素开始生成组合 generate_combinations(0, []) # 返回所有组合 return combinations # 示例
numbers = [1, 2, 3, 4, 5]
k = 3 # 使用循环生成组合
combinations = combinations_with_loops(numbers, k) # 打印所有组合
for combo in combinations: print(combo)
法三(深度优先搜索DFS):
从N个数选取k个数的组合--不降原则(DFS)_n个数中选k个不同组合数-CSDN博客
P1036 [NOIP2002 普及组] 选数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)