Python算法:DFS排列与组合算法(手写模板)

文章介绍了如何使用深度优先搜索(DFS)算法实现全排列和组合的计算。通过递归方式,分别展示了计算指定数量数字的全排列以及二进制数的生成。对于全排列问题,算法基于对每个位置尝试所有可能的数字,同时跟踪已使用的数字以避免重复。在组合问题中,算法选择一定数量的元素并打印它们的组合。

自写排列算法:

例:前三个数的全排列(从小到大)

def dfs(s,t):
  if s==t:   #递归结束,输出一个全排列
    print(b[0:n])
  else:
    for i in range(t):
      if vis[i]==False:
        vis[i]=True
        b[s]=a[i]   #存排列
        dfs(s+1,t)
        vis[i]=False
              
a=[1,2,3,4,5,6,7,8,9]
b=[0]*10   #记录生成的一个全排列
vis=[False]*10  #记录第 i 个数是否用过
n=3
dfs(0,n)   #前 n 个数的全排列 

1 2 3 4 5 的全排列,第1个空格有5种填充方法,相当于第一个数和后面的5-1个数分别做了一次交换。
那么第一个空格的所有情况已经求出来了,同理,在第1个空格的基础上,第2个空格有n-1种填充方法,相当于第2个数和后面的5-2个数分别做了一次交换。

所以我们可以先把以1开头的全排列情况全部求出来,再求以2、3、4、5的,在以1开头的前提下,我们再以2开头,层层递归下去,值得注意的是,交换以后我们需要再交换回来;

 有3个盒子 1、2、3,3张扑克牌 1、2、3,进行扑克牌全排列可以这样实现:
不管面对哪个盒子,都尝试按“1--n”的顺序将扑克牌放入,如果第m张扑克牌已经用过,判断第m+1张是否可用。
当放满n个盒子时,回头,把盒子里面的牌捡回来,再继续按顺序放牌进盒子。

 过程:
第1个盒子:放入1号牌
第2个盒子:本来应该放入1号牌,但是由于1号牌已用,只能按顺序放入2号牌

评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力的敲码工

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值