Python算法竞赛:排列组合核心用法
2026/6/3 1:25:41 网站建设 项目流程

排列组合是算法竞赛、笔试面试的高频考点,核心区别:排列重顺序,组合不重顺序。Python 自带标准库可快速解题,搭配回溯算法能覆盖所有变形场景。本文结合洛谷B2164组合数、洛谷P1706全排列、LeetCode77组合3道经典题,一站式搞定排列组合的内置函数用法与手写实现。

一、组合数计算:只求数量,不枚举(洛谷B2164)

题目核心

给定n、k,求C(n,k) mod 1e9+7(从n个元素选k个的方案数,顺序无关)。

数学公式

C(n,k)=n!/(k!*(n−k)!)

Python 极简解法(math.comb)

Python 3.10+ 提供math.comb直接计算组合数,搭配取模即可通过本题。

frommathimportcomb MOD=10**9+7n,m=map(int,input().split())# 直接计算组合数并取模ans=comb(n,m)%MODprint(ans)

样例输入:5 3 →输出:10

手写组合数(兼容低版本)

defcalc_comb(n,k):ifk<0ork>n:return0ifk==0ork==n:return1k=min(k,n-k)# 减小计算量res=1foriinrange(1,k+1):res=res*(n-k+i)//ireturnres MOD=10**9+7n,m=map(int,input().split())print(calc_comb(n,m)%MOD)

二、全排列生成:有序枚举所有序列(洛谷P1706)

题目核心

按字典序输出1~n的全排列,每个数字占5个字符宽度。

核心概念

排列:元素顺序不同算不同结果,用itertools.permutations生成。

Python 标准库解法

fromitertoolsimportpermutations n=int(input())# 生成1~n的列表nums=list(range(1,n+1))# 生成全排列perms=permutations(nums)# 按格式拼接:每个数字占5位result=[''.join(f'{num:5d}'fornuminp)forpinperms]print('\n'.join(result))

样例输入:3 → 输出按要求对齐的6行全排列。

回溯手写全排列(竞赛必备模板)

n=int(input())res=[]used=[False]*(n+1)# 标记数字是否被使用defbacktrack(path):iflen(path)==n:res.append(''.join(f'{x:5d}'forxinpath))returnforiinrange(1,n+1):ifnotused[i]:used[i]=Truepath.append(i)backtrack(path)path.pop()used[i]=Falsebacktrack([])print('\n'.join(res))

三、组合枚举:生成所有k元子集(LeetCode77)

题目核心

给定n、k,返回[1,n]中所有k个数的组合(无序,不重复)。

标准库解法(itertools.combinations)

fromtypingimportListfromitertoolsimportcombinationsclassSolution:defcombine(self,n:int,k:int)->List[List[int]]:nums=list(range(1,n+1))# 生成所有k元组合return[list(c)forcincombinations(nums,k)]

样例输入:n=4,k=2 → 输出6个组合。

回溯+剪枝(高效手写版)

组合无需顺序,用start避免重复,剪枝可大幅提速。

fromtypingimportListclassSolution:defcombine(self,n:int,k:int)->List[List[int]]:res=[]defbacktrack(start,path):# 剪枝:剩余元素不够凑k个,直接返回iflen(path)+(n-start+1)<k:returniflen(path)==k:res.append(path.copy())returnforiinrange(start,n+1):path.append(i)backtrack(i+1,path)# 从下一个数开始,避免重复path.pop()backtrack(1,[])returnres

四、核心对比:排列 vs 组合

类型顺序函数典型场景
排列permutations排队、排序、序列
组合combinations/comb选人、选子集、方案数

快速选择指南

  1. 只求方案数→ 用math.comb(组合数)
  2. 生成所有有序序列→ 用permutations或全排列回溯
  3. 生成所有无序子集→ 用combinations或组合回溯
  4. 算法竞赛/面试 → 必须掌握回溯模板(内置函数可能受限)

总结

  1. 组合数:math.comb一步到位,搭配取模适配大数场景;
  2. 全排列:permutations快速生成,回溯可处理自定义约束;
  3. 组合枚举:combinations极简,回溯+剪枝更高效。

吃透这3道题与两套写法,Python 排列组合类题目直接秒杀。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询